• 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;
    }
    };

  • 相关阅读:
    Linux常用命令大全
    Shell常用命令整理
    登录织梦后台提示用户名不存在的解决方法介绍
    dedecms系统后台登陆提示用户名密码不存在
    dede被注入后台提示用户名不存在解决方法
    织梦dedecmsV5.7联动类型无法显示的处理方法
    漏洞安全防范
    Sublime 安装、插件CoolFormat
    如何查看sublime安装了哪些插件
    本地如何使用phpstudy环境搭建多站点
  • 原文地址:https://www.cnblogs.com/lqerio/p/11894455.html
Copyright © 2020-2023  润新知