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

  • 相关阅读:
    json web token 入门
    Mysql查询表注释和字段注释信息
    Nginx核心知识100讲学习笔记(陶辉):目录
    Kubernetes进阶实战读书笔记:网络存储
    Kubernetes进阶实战读书笔记:持久化存储卷(pv详解)
    Kubernetes进阶实战读书笔记:存储卷概述
    sybase
    Delphi 解决StrToDateTime()不是有效日期类型的问题
    delphi TStringList 用法详解
    看看Delphi中的列表(List)和泛型
  • 原文地址:https://www.cnblogs.com/lqerio/p/11894455.html
Copyright © 2011-2022 走看看