Leetcode 39: Combination Sum
阿新 • • 發佈:2017-11-07
back first eth mit mes which ray 100% length
Given a set of candidate numbers (C) (without duplicates) 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.
- 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] ]
The below algorithm beats 100% of all the leetcode answers in C#.
1 public class Solution { 2 public IList<IList<int>> CombinationSum(int[] candidates, int target) { 3 //idea 1: brute force, generate all possible combination which has 2^N possibilities and check whether 4 // each combination‘s sum equals target. This doesn‘t work though as one element can be used multi times. 5 6 // idea 2: backtracking, potential optimazition, sort the candidates first. Memorization probably will help7 // but it‘s a little bit hard to check dup output 8 var result = new List<IList<int>>(); 9 10 Array.Sort(candidates); 11 if (candidates.Length == 0 || target < candidates[0]) return result; 12 13 DFS(candidates, target, 0, new List<int>(), result); 14 15 return result; 16 } 17 18 private void DFS(int[] candidates, int target, int sum, IList<int> res, IList<IList<int>> result) 19 { 20 if (target < sum) return; 21 if (target == sum) 22 { 23 result.Add(new List<int>(res)); 24 return; 25 } 26 27 for (int i = 0; i < candidates.Length; i++) 28 { 29 if (sum + candidates[i] > target) 30 { 31 break; 32 } 33 34 // to make sure the output result is always sorted to avoid duplicate 35 if (res.Count > 0 && candidates[i] < res[res.Count - 1]) continue; 36 37 res.Add(candidates[i]); 38 DFS(candidates, target, sum + candidates[i], res, result); 39 res.RemoveAt(res.Count - 1); 40 } 41 } 42 }
Leetcode 39: Combination Sum