zoukankan      html  css  js  c++  java
  • 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;
    }
    };

  • 相关阅读:
    Java中Filter、Servlet、Listener的学习 (转)
    Servlet 获取商品信息作业
    Servlet 注册与提交作业
    jsp servlet的区别和联系(转)
    用户注册验证留言程序
    作业1
    简单新闻发布系统
    webform 增速删改查 方法
    存取数据库图片
    打印 保存
  • 原文地址:https://www.cnblogs.com/lqerio/p/11894455.html
Copyright © 2011-2022 走看看