40. 组合总和 II

Posted zjuhaohaoxuexi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了40. 组合总和 II相关的知识,希望对你有一定的参考价值。

题目描述:

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.
Elements in a combination (a 1, a 2, … , a k) must be in non-descending order.
(ie, a 1 ≤ a 2 ≤ … ≤ a k).
The solution set must not contain duplicate combinations.

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

思路:

和set2的思路一样,从原始的起始点开始一层一层的产生一个个的组合,每一个组合都是由一个前缀+一个元素构成,我们都是在合法前缀基础上产生组合的,所以我们产生的组合不会发生遗漏,同一个前缀加不同的元素构成的组合当然不同,由于前缀不同,由不同的前缀产生的组合之间更不同了,所以这样产生的组合不会重合。

代码:

 1 class Solution {
 2 public:
 3     vector<vector<int> > combinationSum2(vector<int> &num, int target) {
 4 
 5         vector<vector<int>> ret;
 6         sort(num.begin(),num.end());
 7         vector<int> temp;
 8         int curSum = 0;
 9         combinationSum2Core(num,0,ret,temp,curSum,target);
10         return ret;        
11     }
12 
13     void combinationSum2Core(vector<int> &num,int start,vector<vector<int>> &ret,vector<int> &temp,int &curSum,int target)
14     {
15         if(start == num.size())
16             return;
17         for(int i = start;i < num.size();i++)
18         {
19             if(i != start && num[i] == num[i-1])//每一次产生的前缀都是唯一的,满足给定的条件时,以这个
20                 continue;                       //前缀为基础的dfs就可以停止了
21 
22             curSum += num[i];
23             if(curSum > target)
24             {
25                 curSum-=num[i];
26                 return;//剪枝
27             }
28             else if(curSum == target)
29             {
30                 temp.push_back(num[i]);
31                 ret.push_back(temp);
32                 temp.pop_back();
33                 curSum-=num[i];
34                 return;//剪枝
35             }
36             else
37             {
38                 temp.push_back(num[i]);
39                 combinationSum2Core(num,i+1,ret,temp,curSum,target);
40                 temp.pop_back();
41                 curSum-=num[i];
42             }                
43         }
44     }    
45 };

 

以上是关于40. 组合总和 II的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----40. 组合总和 II

[回溯算法]leetcode40. 组合总和 II(c实现)

40. 组合总和 II

40. 组合总和 II

40. 组合总和 II

LeetCode40. 组合总和 II