leetcode 39 dfs leetcode 40 dfs

leetcode 39

先排序,然后dfs

注意先整全局变量可以减少空间利用

class Solution {
vector<vector<int>>ret;
vector<int>temp;
vector<int> srt;
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        srt=candidates;
        sort(srt.begin(),srt.end());
        dfs(target,0); //从下标0开始,杜绝0 1 ,1 0下这样的重复
        return ret;
    }
void dfs(int target,int index){
    if(target==0)
    {
        ret.push_back(temp);
        return;
    }
    for(int i=index;i<srt.size()&&(target-srt[i]>=0);i++)
    {
        temp.push_back(srt[i]);
        dfs(target-srt[i],i);
        temp.pop_back();
    }
    return;
}

};

leetcode 40

在39的基础上改了改

注意 vector的find是借助algorithm实现的

class Solution {
vector<vector<int>>ret;
vector<int>temp;
vector<int> srt;
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        srt=candidates;
        sort(srt.begin(),srt.end());
        dfs(target,0); //从下标0开始,杜绝0 1 ,1 0下这样的重复
        return ret;
    }
    void dfs(int target,int index){
    if(target==0)
    {
        //vector<vector<int>> :: itrator it;
        if(find(ret.begin(),ret.end(),temp)==ret.end())
        ret.push_back(temp);
        return;
    }
    for(int i=index;i<srt.size()&&(target-srt[i]>=0);i++)
    {
        temp.push_back(srt[i]);
        dfs(target-srt[i],i+1);
        temp.pop_back();
    }
    return;
}
};

然后剪枝的话这样

class Solution {
vector<vector<int>>ret;
vector<int>temp;
int tp;
vector<int> srt;
int tar;
public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        srt=candidates;
        sort(srt.begin(),srt.end());
        tar=target;
        dfs(target,0); //从下标0开始,杜绝0 1 ,1 0下这样的重复
        return ret;
    }
    void dfs(int target,int index){
    if(target==0)
    {
        //vector<vector<int>> :: itrator it;
        //if(find(ret.begin(),ret.end(),temp)==ret.end())
        ret.push_back(temp);
        return;
    }
    for(int i=index;i<srt.size()&&(target-srt[i]>=0);i++)
    {
        if(i>index&&srt[i]==srt[i-1])  //index表示的是当前target对应的,开始的位置,后续如果==index,对于同一个target会形成重复;若是不同target不会重复
        continue;
        temp.push_back(srt[i]);
        dfs(target-srt[i],i+1);
        temp.pop_back();
    }
    return;
}
};

猜你喜欢

转载自www.cnblogs.com/lqerio/p/11894455.html