栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode39.40组合总和(dfs+回溯)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode39.40组合总和(dfs+回溯)

39.题目描述(来源LeetCode)

 思路:像这种求可行解的一般会想到要用回溯算法,回溯的过程记录可行解,不合适就回退一步,换一条道继续搜,继续回溯,对于每一个数,在每次搜索的时候有两种情况,加入可行解数组和不加入。搜索结束条件1.当加入可行解数组的和等于target的时候,2.当遍历完数组的时候

代码实现C++: 
class Solution {
public:
    vector> combinationSum(vector& candidates, int target) {
        vector num;//存放每一次回溯的可行解
        vector> res;//所有可行解
        sort(candidates.begin(),candidates.end());//注意,一定要是有序数组,不然在剪枝的过程会漏掉可行解
        dfsback(candidates,num,res,target,0);
        return res;
    }
    void dfsback(vector& candidates,vector& num,vector>& res,int target,int start){
        if(target==0){//当target==0说明该次搜索的可行解是ok的
            res.push_back(num);
            return;
        }
        for(int i=start;i=0){
                num.push_back(candidates[i]);
                dfsback(candidates,num,res,target-candidates[i],i);//开始下一次搜索,还是从i开始,表示将该数继续加入可行解,如果不满足,在回溯的过程会将该数弹出,一般dfs+回溯的代码上下对称哦
                num.pop_back();
            }else{
                break;
            }
        }
    }
};
升级版: 40.无重复数字的可行解

 思路:无重复数字,意味着每个数字只有一种情况,加入或者不加入可行解,但是,我们要在先判断该数在数组里是否重复,有一个很好的办法就是排序,让每一个元素与前面一个元素比较是否相等就可以排除重复元素。

代码实现C++:
class Solution {
public:
        vector> res;//存最后的可行解组成的数组
        vector num;//存每一次遍历的可行解
        vector candidates;//数组
    vector> combinationSum2(vector& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        this->candidates=candidates;
        dfsback(0,target);//
        return res;
    }
    void dfsback(int start,int target){//start每次搜索的起始位置和target目标值
        if(target==0){
            res.push_back(num);
            return;
        }
        for(int i=start;i=0;i++){
            if(i>start&&candidates[i]==candidates[i-1]){//i>start是用来每次至少加入重复元素一个的,比如12224 在从第二个2开始遍历的时候,我们之加入一个2,但如果没有i>start限制,我们就无法加入当前的在原数组中有重复的元素了
                continue;
            }
            num.push_back(candidates[i]);
            dfsback(i+1,target-candidates[i]);//只有一种情况就是加入该元素并搜索下一个位置
            num.pop_back();
        }
    }
};

今日刷题任务完成啦~被回溯折磨的一天(欢迎大家在评论区交流哦!!)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290877.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号