用一道leetcode题,4 Sum,这题标准答案不是dfs,但是我用了dfs,超时,关键是bug..
这是有bug的代码
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>>ll = new ArrayList<>();
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);
dfs(ll,list,nums,0,target,0,nums.length,0);
System.out.println(ll);
return ll;
}
private void dfs(List<List<Integer>>ll,List<Integer>list,int[]nums,int cur,int target,int index,int endnum,int size){
if(cur==target&&size==4){
ll.add(list);//这是超级大坑
System.out.println(ll);
}
if(index >= endnum)return;
list.add(nums[index]);
dfs(ll,list,nums,cur+nums[index],target,index+1,endnum,size+1);
list.remove(list.size()-1);
dfs(ll,list,nums,cur,target,index+1,endnum,size);
}
运行结果:
经过分析知道,每次ll加入的是一个新的引用list的List;也就是说ll里面的元素都是指向着唯一的list,list每次改变这些元素都会改变。所以代码应该是这样的
public class Solution {
private Set<List<Integer>>set ;
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>>ll = new ArrayList<>();
set = new HashSet<List<Integer>>();
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);
dfs(set,list,nums,0,target,0,nums.length,0);
ll.addAll(set);
return ll;
}
private void dfs(Set set,List<Integer>list,int[]nums,int cur,int target,int index,int endnum,int size){
if(cur==target&&size==4){
set.add(new ArrayList<>(list));//变成new一个新ArrayList
}
if(index >= endnum)return;
list.add(nums[index]);
dfs(set,list,nums,cur+nums[index],target,index+1,endnum,size+1);
list.remove(list.size()-1);
dfs(set,list,nums,cur,target,index+1,endnum,size);
}
}