LeetCode39. 组合总和
方法:回溯法+减枝
回溯法(深度搜索)解的所有可能性;
减枝:保证每个解之间元素不重复;
public List<List<Integer>> combinationSum(int[] num,int target) {
Arrays.sort(num); //通过排序的方式,减少固定位置的减操作
int len = num.length;
List<List<Integer>> res =new ArrayList<List<Integer>>();
ArrayList<Integer> temp = new ArrayList<Integer>();
dfs(num, len, temp, res,tar);
return res;
}
public void dfs(int[] num,int len,ArrayList<Integer> temp,List<List<Integer>> res,int tar) {
if(temp.size()>= 2 && temp.get(temp.size()-1) < temp.get(temp.size()-2)){ //减枝,保证结果不重复
return;
}
if (tar == 0) {
res.add(new ArrayList<Integer>(temp));
return;
}
for (int i = 0; i < num.length; i++) {
// if ( tar < 0) { 之前试过在这里用return,尽管能通过,但是时间很慢,是因为每层的每个位置都要考虑数组的所有元素
// return;
// }
tar -= num[i];
if ( tar < 0) { //当tar<0,候选数组重排序过,后面的数组元素均>num[i],所以至结束该层搜索,并且结束后面所有备选数组元素在该位置的可能性
break;
}
temp.add(num[i]);
dfs(num, len, temp, res, tar);
temp.remove(temp.size()-1); //回溯
tar += num[i]; //回溯
}
}