ii 组合总和_40. 组合总和 II – 力扣(LeetCode)
題目描述
給定一個數組?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]
]
題解
此題與“組合之和”一題有兩個不同:一是該題數組中的數字可能會重復;二是每個數字在每個組合中只能使用一次。
數字重復帶來的一個問題是組合可能會重復,所以需要做去重處理。
同“組合之和”一題一樣,這里使用的也是遞歸+剪枝,這里首先對數據進行排序,方便剪枝和去重。
每個數字只能使用一次,可以修改遞歸的起點,之前是i,這里可以修改為i + 1。
其它細節具體見代碼。
代碼
class Solution {
public:
vector> res;
vectorsol;
void dfs(vector& nums, int beg, int target){//遞歸
for(int i = beg; i < nums.size(); ++i){
if(target - nums[i] < 0){//之和大于則直接return
return;
}
if(i > beg && nums[i] == nums[i - 1]){//去重
continue;
}
sol.push_back(nums[i]);
if(target == nums[i]){//滿足條件 放到題解中
res.push_back(sol);
sol.pop_back();
return;
}
else{
dfs(nums, i + 1, target - nums[i]);//之和小于target,則繼續向下遞歸,注意此時beg是從i+1開始的
sol.pop_back();
}
}
}
vector> combinationSum2(vector& candidates, int target) {
sort(candidates.begin(), candidates.end());
dfs(candidates, 0, target);
return res;
}
};
運行結果
總結
以上是生活随笔為你收集整理的ii 组合总和_40. 组合总和 II – 力扣(LeetCode)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx 获取header 请求参数_
- 下一篇: kali如何制作php字典_Kali L