1. 程式人生 > >Leetcode 39: Combination Sum

Leetcode 39: Combination Sum

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 help
7 // 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