Skip to content

Latest commit

 

History

History
30 lines (30 loc) · 1.67 KB

combinesumI.md

File metadata and controls

30 lines (30 loc) · 1.67 KB

题目描述:
image
解题过程:
是真的不会,因为一个数字可以重复利用,一开始还想着能不能用数学的方法列举出来,我竟然发现根本不可以。然后看了题解,看了图之后以为恍然大悟了,当然也看了代码哈哈哈,就来写,写了好久没写出来我靠,又看一次题解,这次没看代码,直接看图,发现自己犯下了一个很严重的错误—根本没有理解题解。我的解法是以数组的第一个值为根节点,而题解是以一个空节点为跟节点,左边是不选择当前节点直接来到下一个节点,右边是选择当前节点再继续来到当前节点。真的赖皮蛇。 自己还添加了一个亮点吧算是,就是先把数组升序排序然后再寻找,我觉得这样子可以减去很多不必要的查找。
代码:

class Solution {
private:
    vector<vector<int>> res;
    vector<int> temp;
public:
    void dfs(vector<int> candidates,int target,int index) {
        if (target == 0) {
            res.push_back(temp); return;
        } else if ((index < candidates.size() && candidates[index] > target) || target < 0 || index >= candidates.size()) return;
        dfs(candidates,target,index+1);
        if (target - candidates[index] >= 0) {
            temp.push_back(candidates[index]);
            dfs(candidates,target-candidates[index],index);
        }
        temp.pop_back();
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        dfs(candidates,target,0);
        return res;
    }
};