标签:
原题链接在这里:https://leetcode.com/problems/combination-sum/
本题与Combinations, Permutations, N-Queens都是递归回溯类问题。
target每次减掉candidates里一个数,然后递归调用helper, target设成target - candidates[i]. 递归的终止条件是target == 0时 加入item的copy, target < 0说明已经减多了,直接return.
Note: 1.题目中说要从小到大,所以别忘了candidates的排序。
2. 举例若 target 是 3,candidates = [1,2], 为了不返回[1,2],[2,1]两个重复的值,递归调用时需加入限定条件start.每次loop, i 从开始循环。
3. 循环中加入if(i>0 && candidates[i] == candidates[i-1]) continue; 是因为本题允许使用重复元素,若后面元素相同则不能再进行此验算。
e.g. 若是candidates = [1,1,2], target 是 3, 则会返回多组 [1,1,1].
AC Java:
1 public class Solution { 2 public List<List<Integer>> combinationSum(int[] candidates, int target) { 3 List<List<Integer>> res = new ArrayList<List<Integer>>(); 4 if(candidates == null || candidates.length == 0){ 5 return res; 6 } 7 Arrays.sort(candidates); 8 helper(candidates,target,0,new ArrayList<Integer>(),res); 9 return res; 10 } 11 private void helper(int[] candidates, int target, int start, List<Integer> item, List<List<Integer>> res){ 12 if(target == 0){ 13 res.add(new ArrayList<Integer>(item)); 14 return; 15 } 16 if(target < 0){ 17 return; 18 } 19 for(int i = start; i<candidates.length; i++){ 20 //这里可以使用重复元素,所以若是下一个元素与之前元素相同则没有必要对下一个元素进项判断,浪费时间 21 if(i>0 && candidates[i] == candidates[i-1]){ 22 continue; 23 } 24 item.add(candidates[i]); 25 helper(candidates,target-candidates[i],i,item,res); 26 item.remove(item.size()-1); 27 } 28 } 29 }
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4845242.html