public class Solution
    {
        List<IList<int>> list = new List<IList<int>>();//全部记录
        List<int> records = new List<int>();//一条记录        
        bool bk = false;
        private void BackTrack(List<int> candidates, int target, int sum)
        {
            if (sum == target)
            {
                int[] temp = new int[records.Count];
                records.CopyTo(temp);
                bool same = false;
                foreach (var l in list)
                {
                    if (l.Count == temp.Length)
                    {
                        var l1 = l.OrderBy(x => x).ToList();
                        var l2 = temp.OrderBy(x => x).ToList();
                        var samecount = 0;
                        for (int x = 0; x < l1.Count; x++)
                        {
                            if (l1[x] == l2[x])
                            {
                                samecount++;
                            }
                        }
                        if (samecount == l.Count)
                        {
                            same = true;
                            break;
                        }
                    }                    
                }
                if (!same)
                {
                    list.Add(temp.ToList());
                }
                bk = true;
                return;
            }
            else if (sum < target)
            {
                bk = true;
                for (int position = 0; position < candidates.Count; position++)
                {
                    var cur = candidates[position];
                    sum += cur;
                    records.Add(cur);
                    BackTrack(candidates, target, sum);
                    //回溯
                    records.RemoveAt(records.Count - 1);
                    sum -= cur;
                    if (bk)
                    {
                        bk = false;
                        break;
                    }
                }
            }
            else
            {
                bk = true;
                return;
            }
        }

        public IList<IList<int>> CombinationSum(int[] candidates, int target)
        {
            var can = candidates.OrderBy(x => x).ToList();
            BackTrack(can, target, 0);
            return list;
        }
    }

补充一个python的实现,写的要简单的多了:

 1 class Solution:    
 2     def dfs(self,candidates,target,index,path,l):
 3         if target < 0:
 4             return
 5         elif target == 0:
 6             l.append(path)
 7             return
 8         for i in range(index,len(candidates)):
 9             self.dfs(candidates,target-candidates[i],i,path+[candidates[i]],l)
10         return
11 
12     def combinationSum(self, candidates: 'List[int]', target: 'int') -> 'List[List[int]]':
13         l = list()
14         path = []
15         candidates.sort()
16         self.dfs(candidates,target,0,path,l)
17         return l

 

posted on 2018-10-08 18:38  Sempron2800+  阅读(137)  评论(0编辑  收藏  举报