给定一个数组
candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。
说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8, 所求解集为: [ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5, 所求解集为: [ [1,2,2], [5] ]
反正还是搜
要注意的是需要一个剪枝和去重操作,用一个后缀和计算,如果后面所有的值加起来没不到目标值,可以直接return
(或者有个思路就是计算所有数出现的个数,然后和39题一样,只不过出现的次数需要改一下)
class Solution {
public:
vector<vector<int>> out;
void dfs(int x,vector<int> candidates,int target,vector<int> temp,int sum[]){
if(target == 0){
sort(temp.begin(),temp.end());
for(int i = 0;i < out.size();i++){
if(out[i] == temp) return;
}
out.push_back(temp);
return ;
}
if(sum[x] < target) return;
if(target < 0 || x == candidates.size()) return;
dfs(x + 1,candidates,target,temp,sum);
temp.push_back(candidates[x]);
dfs(x + 1,candidates,target - candidates[x],temp,sum);
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
int sum[100];
int cnt = 0;
for(int i = candidates.size() - 1 ; i>=0;i--){
cnt += candidates[i];
sum[i] = cnt;
}
vector<int> temp;
dfs(0,candidates,target,temp,sum);
return out;
}
};