问题描述
Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
Each number in candidates 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.
Example 1:
Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
解法思路
类似于39题,利用回溯法。注意每个数只能用一次
C++代码
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
int n=candidates.size();
vector<vector<int>> res;
for(int i=0;i<n;++i)
{
//重复的数字不用再次遍历,因为前面的数字包括了他的所有情况
if(i-1>=0&&candidates[i]==candidates[i-1]) continue;
vector<int> combo;
Dfs(res,combo,i,target,candidates);
}
return res;
}
void Dfs(vector<vector<int>> &res,vector<int> combo,int index,int target,vector<int>&nums)
{
target=target-nums[index];
if(target<0) return;
combo.push_back(nums[index]);
if(target==0)
{
res.push_back(combo);
return;
}
for(int i=index+1;i<nums.size()&&nums[i]<=target;++i)
{
if(i-1>index&&nums[i]==nums[i-1]) continue;
Dfs(res,combo,i,target,nums);
}
}
};
算法结果
Runtime: 8 ms, faster than 100.00% of C++ online submissions for Combination Sum II.
Memory Usage: 9.7 MB, less than 98.31% of C++ online submissions for Combination Sum II.