java - 为什么我们要在一些递归算法中复制一个ArrayList?

标签 java algorithm arraylist

http://oj.leetcode.com/problems/subsets-ii/

给定一个可能包含重复项的整数集合 S,返回所有可能的子集。

注意:

* Elements in a subset must be in non-descending order.
* The solution set must not contain duplicate subsets.

例如, 如果 S = [1,2,2],一个解决方案是:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

答案是:

public class Solution {
   public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
       ArrayList<ArrayList<Integer>> ans = new ArrayList<ArrayList<Integer>>();
       ArrayList<Integer> tmp = new ArrayList<Integer>();
       Arrays.sort(num);
       sub(num, 0, tmp, ans);
       return ans;        
   }

   public void sub(int[] num, int k, ArrayList<Integer> tmp, ArrayList<ArrayList<Integer>> ans) {
       ArrayList<Integer> arr = new ArrayList<Integer>(tmp);            
       ans.add(arr);       

       for (int i = k; i < num.length; i++) {
           if (i != k && num[i] == num[i-1]) continue;

           tmp.add(num[i]);
           sub(num, i+1, tmp, ans);
           tmp.remove(tmp.size()-1);
       }
   }
}

不知道为什么

 ArrayList<Integer> arr = new ArrayList<Integer>(tmp);            
 ans.add(arr);

但不是直接的:

 ans.add(tmp);

最佳答案

如果你只是想打印出结果,因为你删除了递归调用后添加的任何元素,tmp 在函数的开始和结束处看起来应该完全相同,所以它应该没有任何区别(您的方式将是首选,因为它不会在每一步复制 ArrayList)。

但是当您将结果添加到 ans 时,问题就来了。

如果您使用自己的方式,将只有一个 ArrayList float - 您只需多次将它添加到 ans

请注意,将它添加到 ans 中实际上并没有创建它的副本,它只是将对 ArrayList 的引用添加到 ans .因此,在添加原始元素后对其进行更改也会更改 ans 的元素。

Live demo showing the correct result by printing them out and the incorrect results in the returned array .

关于java - 为什么我们要在一些递归算法中复制一个ArrayList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20738079/

相关文章:

java - 当我读取文本文件时如何跳行?

java - 如何获取 Arraylist 内的 Hashmap 值

java - 访问数组列表中的对象(java)

java - 获取jtextfield的值并将其以另一种形式放入标签

java - 为什么我在部署以下 mule flow 时遇到 "inputstream payload cant be distributed"由于 ObjectStoreException?

java - ils。从远程服务器调用CURL后重定向不起作用

python - 在循环迭代中另外比较两个数字

java - 使用单一命令行 Java (Linux) 编译和构建

python - 按步长值更改对数组中的数字进行分组

ios - 如何在某些条件为真时重复操作?