小编典典

Java中的整数分区

algorithm

这是我执行此操作的代码。它适用于字符串表示形式,但不适用于一个字符串表示形式ArrayList<ArrayList<Integer>>

public static void partition(int n) {
    partition(n, n, "", new ArrayList<ArrayList<Integer>>(), new ArrayList<Integer>());
}
public static void partition(int n, int max, String temp, ArrayList<ArrayList<Integer>> master, ArrayList<Integer> holder) {
    if (n == 0) {
        ArrayList<Integer> temp1 = new ArrayList<Integer>();
        for(int i=0;i<=holder.size();i++)
        {
            temp1.add(holder.get(0));
            holder.remove(0);
        }
        master.add(temp1);
        System.out.println(temp);
    }

    for (int i = Math.min(max, n); i >= 1; i--) {
        holder.add(i);
        partition(n-i, i, temp + " " + i,master,holder);
    }
}

我用temp1做有趣的事情的原因是,如果我只是将temp添加到master,则先前的元素会发生变化(master中的所有元素都将指向同一位置的引用),所以这是我的尝试复制+清除。

该字符串有效。为什么不ArrayList<ArrayList<Integer>>呢?我该如何解决?

(ArrayList>的输出为[[5],[4、1],[3、2],[1、1],[2、2],[1、1、1],[1、1、1 ,1]])


阅读 371

收藏
2020-07-28

共1个答案

小编典典

您正在混合holder数组if,而不应该这样做。尝试以下方法:

public static void partition(int n, int max, String temp, ArrayList<ArrayList<Integer>> master, ArrayList<Integer> holder) {
    if (n == 0) {
        ArrayList<Integer> temp1 = new ArrayList<Integer>();
        for (int i = 0; i < holder.size(); i++) {
            temp1.add(holder.get(i));
        }
        master.add(temp1);
        System.out.println(temp);
    }

    for (int i = Math.min(max, n); i >= 1; i--) {
        holder.add(i);
        partition(n - i, i, temp + " " + i, master, holder);
        holder.remove(holder.size() - 1);
    }
}
2020-07-28