【发布时间】:2017-02-24 13:52:41
【问题描述】:
当我试图解决子集问题时,我会编写这样的代码:
public class Subsets {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, 0);
return list;
}
public void backtrack(List<List<Integer>> list, ArrayList<Integer>temp, int[] nums, int start){
list.add(temp);
for(int i = start; i<nums.length;i++){
temp.add(nums[i]);
backtrack(list, temp, nums, i++);
temp.remove(temp.size()-1);
}
}
}
输出是
[[],[],[],[],[],[],[],[]]
但正确答案应该是
[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]
当我像这样更改“回溯”代码时,答案是正确的:
public void backtrack(List<List<Integer>> list, List<Integer> temp, int[] nums, int start){
list.add(new ArrayList(temp));
for(int i = start; i<nums.length;i++){
temp.add(nums[i]);
backtrack(list, temp, nums, i+1);
temp.remove(temp.size()-1);
}
}
我的问题:为什么我需要编写这样的代码:
public void backtrack(List<List<Integer>> list, List<Integer> temp, int[] nums, int start){
list.add(new ArrayList(temp));
而不是那个:
public void backtrack(List<List<Integer>> list, ArrayList<Integer> temp, int[] nums, int start){
list.add(temp);
【问题讨论】:
-
感谢您的快速接受。我很高兴它对你有用!