整数分区算法的递归方法

时间:2014-04-14 19:13:53

标签: java android algorithm

我需要通过所涉及的元素(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功能

2 个答案:

答案 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){     //你做了同样的事情,但是将你找到的值推送到结果列表。 }

相关问题