1. 程式人生 > 其它 >Week05 Day03(2022/3/30)

Week05 Day03(2022/3/30)

✅做題思路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;
    }
};