/*
* 先对candidates中的元素按从小到大排序,能节省时间
*/
public class Solution {
List<List<Integer>> res = new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
if(candidates==null||candidates.length==0) return res;
int len = candidates.length;
int[] visited = new int[len];
Arrays.fill(visited, 0);
Arrays.sort(candidates);
dfs(new ArrayList<Integer>(), candidates, 0, target, visited);
return res;
}
public void dfs(List<Integer> list, int[] candidates, int sum, int target, int visited[]){
int len = candidates.length;
for(int i=0;i<len;++i){
if(visited[i]==1) continue;
if(sum + candidates[i]==target){
List<Integer> tmp = new ArrayList<Integer>(list);
tmp.add(candidates[i]);
Collections.sort(tmp);
if(!res.contains(tmp)){
res.add(tmp);
}
}else if(sum + candidates[i] < target){
List<Integer> tmp = new ArrayList<Integer>(list);
tmp.add(candidates[i]);
int[] tv = visited.clone();
tv[i] = 1;
dfs(tmp, candidates, sum + candidates[i], target, tv);
}else{
/*
* 因为已经把candidates数组按从小到大排序,所以当sum + candidates[i] > target
*后,candidates的i以后的元素都不用试了,肯定不满足
*/
break;
}
}
}
}
40 Combination Sum II
最新推荐文章于 2020-06-17 17:11:44 发布