我需要通过所涉及的元素(M)的数量找到数字(N)的可能分区之一,如下所示:
Number 4 Partitions 4 3 1 2 2 2 1 1 1 3 1 1 1 1
我需要创建一个函数P(N,M),它将为调用P(4,2)返回以下结果:
3 1 2 2 1 3
我创建了以下方法,但是找不到破解每个分区之间界限的方法:
List<String> partitions;
public String[] partitionWithNElements(int n, int numberOfElements) {
partitions = new ArrayList<String>();
partition(n, n, "");
String[] arrayPartition = null;
for (int i = 0; i < partitions.size(); i++){
arrayPartition = partitions.get(i).split("#");
if (arrayPartition.length == numberOfElements)
break;
}
return arrayPartition;
}
private void partition(int n, int max, String prefix) {
if (n == 0) {
if (prefix.startsWith("#"))
prefix = prefix.substring(1);
partitions.add(prefix);
return;
}
for (int i = Math.min(max, n); i >= 1; i--) {
partition(n-i, i, prefix + "#" + i);
}
}
代码再次更新。现在我使用一个字符串来返回元素并且我已经能够实现预期的结果,但是我试图找到一个解决方案而不使用String来返回分区,所以我不需要使用String split功能
答案 0 :(得分:0)
只需将所需大小的分区复制到另一个列表中,然后将其返回。
public List<List<Integer>> partitionWithNElements(int n, int numberOfElements) {
List<List<Integer>> elements = new ArrayList<List<Integer>>();
List<List<Integer>> result = new ArrayList<List<Integer>>();
partition(n, n, elements, null);
List<List<Integer>> result = new ArrayList<List<Integer>>();
for (int i = 0; i < elements.size(); i++) {
if (elements.get(i).size() == numberOfElements) {
result.add(elements.get(i));
}
}
return result;
}
答案 1 :(得分:0)
在函数partitionWithNElements中再添加一个参数是否可以?此参数可以具有类型LIST&gt;。因此,您可以直接通过您使用的变量获取返回列表,而不是返回列表。
功能可以是: public void partitionWithNElements(int n,int numberOfElements,List&gt; result){ //你做了同样的事情,但是将你找到的值推送到结果列表。 }