Combination Sum

Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

For example, given candidate set 2,3,6,7 and target 7
A solution set is: 
[7] 
[2, 2, 3]

 1 public class Solution {
 2     ArrayList<ArrayList<Integer>> result = null;
 3     public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
 4         // Note: The Solution object is instantiated only once and is reused by each test case.
 5         result = new ArrayList<ArrayList<Integer>>();
 6         getSolution(new ArrayList<Integer>(), target, candidates);
 7         return result;
 8     }
 9     public void getSolution(ArrayList<Integer> row, int target, int[] candidates){
10         int i = 0;
11         if(target == 0){
12             result.add(row);
13         }
14         while(i < candidates.length && candidates[i] <= target){
15             row.add(candidates[i]);
16             target -= candidates[i];
17             getSolution(new ArrayList<Integer>(row),target,candidates);
18             row.remove(row.size() - 1);
19             target += candidates[i];
20             i ++;
21         }
22         if(i == 0){
23             return;
24         }
25     }
26 }

没有去重。

eg: [1,1,2] 3

去重包括两部分,1.array 里面有重复: 1,1

                     2.顺序, 如 1,2 ; 2, 1

对于1,先将数组去重。

对于2,后面的选择范围只能从当前选择的元素开始,只能选不比它小的元素。

 1 public class Solution {
 2     ArrayList<ArrayList<Integer>> result = null;
 3     public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {
 4         // Note: The Solution object is instantiated only once and is reused by each test case.
 5         Arrays.sort(candidates);
 6         int start = 0;
 7         for(int i = 1; i < candidates.length; i ++){
 8             if(candidates[i] != candidates[start]){
 9                 candidates[++start] = candidates[i];
10             }
11         }
12         result = new ArrayList<ArrayList<Integer>>();
13         getSolution(new ArrayList<Integer>(), target, candidates, start, 0);
14         return result;
15     }
16     public void getSolution(ArrayList<Integer> row, int target, int[] candidates, int len, int pos){
17         int i = pos;
18         if(target == 0){
19             result.add(row);
20         }
21         while(i <= len && candidates[i] <= target){
22             row.add(candidates[i]);
23             target -= candidates[i];
24             getSolution(new ArrayList<Integer>(row), target, candidates, len, i);
25             row.remove(row.size() - 1);
26             target += candidates[i];
27             i ++;
28         }
29 } 30 }

 第三遍:

 1 public class Solution {
 2     public List<List<Integer>> combinationSum(int[] candidates, int target) {
 3         int len = 0;
 4         Arrays.sort(candidates);
 5         for(int i = 0; i < candidates.length; i ++){
 6             if(i == 0 || candidates[i] != candidates[i - 1]){
 7                 candidates[len ++] = candidates[i];
 8             }
 9         }
10         List<List<Integer>> result = new ArrayList<List<Integer>>();
11         findElement(candidates, 0, len, result, new ArrayList<Integer>(), target);
12         return result;
13     }
14     
15     public void findElement(int[] arr, int start, int end, List<List<Integer>> result, ArrayList<Integer> row, int tar){
16         if(tar == 0) result.add(row);
17         for(int i = start; i < end; i ++){
18             if(arr[i] <= tar){
19                 ArrayList<Integer> rown = new ArrayList<Integer> (row);
20                 rown.add(arr[i]);
21                 findElement(arr, i, end, result, rown, tar - arr[i]);
22             }
23         }
24     }
25 }
原文地址:https://www.cnblogs.com/reynold-lei/p/3363174.html