Week05 Day03(2022/3/30)
阿新 • • 發佈:2022-03-31
✅做題思路or感想
這裡依舊是找組合,故依舊是用回溯法
而因為這裡的元素是可以重複選取的,所以這裡的startIndex
在遞迴時不需要+1,或者直接乾脆不用startIndex
就可以了
但是為了防止[2,2,3],[2,3,2]
這種重複,所以需要安排一下子集都是要遞增的就好了
class Solution { public: vector<int>temp; vector<vector<int>>result; //這裡直接取消了startIndex,不需要再強制性的縮小取值範圍了,因為單個值可以無限的取 void dfs(vector<int>& candidates, int target) { if (target < 0)return; //容易想到且有效的剪枝 if (target == 0) { //遞迴中止條件 result.push_back(temp); return; } //處理資料 for (int i = 0; i < candidates.size(); i++) { //這裡if是維持子集是單調遞增的! if (temp.size() != 0 && temp.back() <= candidates[i] || temp.size() == 0) { temp.push_back(candidates[i]); dfs(candidates, target - candidates[i]); temp.pop_back();//回溯 } } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { dfs(candidates, target); return result; } };