IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode39.40组合总和(dfs+回溯) -> 正文阅读

[数据结构与算法]LeetCode39.40组合总和(dfs+回溯)

39.题目描述(来源LeetCode)

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

代码实现C++:?

class Solution {
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<int> num;//存放每一次回溯的可行解
        vector<vector<int>> res;//所有可行解
        sort(candidates.begin(),candidates.end());//注意,一定要是有序数组,不然在剪枝的过程会漏掉可行解
        dfsback(candidates,num,res,target,0);
        return res;
    }
    void dfsback(vector<int>& candidates,vector<int>& num,vector<vector<int>>& res,int target,int start){
        if(target==0){//当target==0说明该次搜索的可行解是ok的
            res.push_back(num);
            return;
        }
        for(int i=start;i<candidates.size();i++){//每次搜索从start开始,因为每一组可行解要是唯一的,如果每次都从0开始遍历+回溯,就会像排列组合一样,有许多重复的可行解
            if(target-candidates[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<vector<int>> res;//存最后的可行解组成的数组
        vector<int> num;//存每一次遍历的可行解
        vector<int> candidates;//数组
    vector<vector<int>> combinationSum2(vector<int>& 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<candidates.size()&&target-candidates[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();
        }
    }
};

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

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 13:05:02  更:2021-10-04 13:06:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:21:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码