Leetcode 40. Combination Sum II

40. Combination Sum II

  • Total Accepted: 76278
  • Total Submissions: 265535
  • Difficulty: Medium

 

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

Each number in C may only be used once in the combination.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

 

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8
A solution set is: 

[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]

 

 

 

思路:还是用回溯法找解,和Leetcode 39. Combination Sum类似。但要注意重复元素造成的干扰,本题排序后,如果有candidates[i]==candidates[i+1]==...==candidates[i+k],只要对candidates[i]进行回溯求解就可以,剩下的candidates[i+1]...candidates[i+k]直接跳过,所以本层的下一个遍历从candidates[i+k+1]开始。

 

代码:

 1 class Solution {
 2 public:
 3     vector<vector<int> > res;
 4     void combinationSum2(vector<int>& v,vector<int>& candidates,int target,int cur){
 5         if(!target){
 6             res.push_back(v);
 7             return;
 8         }
 9         int n=candidates.size(),i;
10         for(i=cur;i<n;i++){
11             target-=candidates[i];
12             if(target>=0){
13                 v.push_back(candidates[i]);
14                 combinationSum2(v,candidates,target,i+1);
15                 v.pop_back();
16             }
17             else{
18                 return;
19             }
20             target+=candidates[i];
21             while(i+1<n&&candidates[i]==candidates[i+1]) i++;//去除重复元素导致的重复场景
22         }
23     }
24     vector<vector<int> > combinationSum2(vector<int>& candidates, int target) {
25         sort(candidates.begin(),candidates.end());
26         vector<int> v;
27         combinationSum2(v,candidates,target,0);
28         return res;
29     }
30 };

 

posted @ 2016-07-27 17:15  Deribs4  阅读(337)  评论(0)    收藏  举报