首页 > 编程语言 >「代码随想录算法训练营」第二十天 | 回溯算法 part2

「代码随想录算法训练营」第二十天 | 回溯算法 part2

时间:2024-07-25 15:30:18浏览次数:8  
标签:target int 随想录 part2 算法 vector candidates vec backtracking

39. 组合总和

题目链接:https://leetcode.cn/problems/combination-sum/
题目难度:中等
文章讲解:https://programmercarl.com/0039.组合总和.html
视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ
题目状态:久违的通过!

思路:

使用回溯模板,在单层循环时判断当前数组值是否大于目标值,若大于,直接跳过,其他思路就是和回溯模板中一样,直接看代码。

代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> vec;
    void backtracking(vector<int> &candidates, int target, int startIndex) {
        if(target == 0) {
            res.push_back(vec);
            return;
        }
        for(int i = startIndex; i < candidates.size(); ++i) {
            if(candidates[i] > target)
                continue;
            vec.push_back(candidates[i]);
            target -= candidates[i];
            backtracking(candidates, target, i);
            vec.pop_back();
            target += candidates[i];
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        
        backtracking(candidates, target, 0);
        return res;
    }
};

剪枝优化后的代码:

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {
        if (sum == target) {
            result.push_back(path);
            return;
        }

        // 如果 sum + candidates[i] > target 就终止遍历
        for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
            sum += candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates, target, sum, i);
            sum -= candidates[i];
            path.pop_back();

        }
    }
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        result.clear();
        path.clear();
        sort(candidates.begin(), candidates.end()); // 需要排序
        backtracking(candidates, target, 0, 0);
        return result;
    }
};

40. 组合总和II

题目链接:https://leetcode.cn/problems/combination-sum-ii/
题目难度:中等
文章讲解:https://programmercarl.com/0040.组合总和II.html
视频讲解:https://www.bilibili.com/video/BV12V4y1V73A
题目状态:借助ChatGPT通过

思路:

在每层递归的时候,要确保当前递归的值和前一个递归的值不相等。因此需要首先对数组排序,之后在执行回溯三部曲。

代码:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> vec;
    void backtracking(vector<int> &candidates, int target, int startIdx) {
        if(target == 0) {
            res.push_back(vec);
            return;
        }
        for(int i = startIdx; i < candidates.size(); ++i) {
            if(i > startIdx && candidates[i] == candidates[i - 1]) 
                continue;
            if(target < candidates[i]) 
                break;
            target -= candidates[i];
            vec.push_back(candidates[i]);
            backtracking(candidates, target, i + 1);
            target += candidates[i];
            vec.pop_back();
        }
    }
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0);
        return res;
    }
};

131. 分割回文串

题目链接:https://leetcode.cn/problems/palindrome-partitioning/
题目难度:中等
文章讲解:https://programmercarl.com/0131.分割回文串.html
视频讲解:https://www.bilibili.com/video/BV1c54y1e7k6
题目状态:这题好难,看题解通过

思路:

通过回溯,每层分割是按照几个元素来分,每次分割后判断分割出来的元素是否是一个回文串,直接理解代码会更好理解一些。

代码:

class Solution {
public:
    vector<vector<string>> res;
    vector<string> vec;
    bool isLoop(string s, int start, int end) {
        for(int i = start, j = end; i < j; i++, j--)
            if(s[i] != s[j]) return false;
        return true;
    }
    void backtracking(string s, int startIdx) {
        if(startIdx >= s.size()) {
            res.push_back(vec);
            return;
        }
        for(int i = startIdx; i < s.size(); ++i) {
            if(isLoop(s, startIdx, i)) {
                string str = s.substr(startIdx, i - startIdx + 1);
                vec.push_back(str);
            } else {
                continue;
            }
            backtracking(s, i + 1);
            vec.pop_back();
        }
    }
    vector<vector<string>> partition(string s) {
        backtracking(s, 0);
        return res;
    }
};

标签:target,int,随想录,part2,算法,vector,candidates,vec,backtracking
From: https://www.cnblogs.com/frontpen/p/18323259

相关文章

  • python cobs协议编解码算法demo
    1.SummaryCOBS(ConsistentOverheadByteStuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为......
  • 基于生物地理学算法优化的TSP问题求解
    智能优化算法应用:基于生物地理学算法的TSP问题求解-附代码文章目录智能优化算法应用:基于生物地理学算法的TSP问题求解-附代码1.TSP问题3.生物地理学算法4.实验参数设定5.算法结果6.Matlab代码7.Python代码摘要:TSP是数学领域内一道著名的难题之一,如何求解一直是......
  • 基于旗鱼算法优化的TSP问题求解
    智能优化算法应用:基于旗鱼算法的TSP问题求解-附代码文章目录智能优化算法应用:基于旗鱼算法的TSP问题求解-附代码1.TSP问题3.旗鱼算法4.实验参数设定5.算法结果6.Matlab代码7.Python代码摘要:TSP是数学领域内一道著名的难题之一,如何求解一直是学术界研究的热点问......
  • ADC滤波的10种经典算法
    A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰......
  • 文心一言 VS 讯飞星火 VS chatgpt (309)-- 算法导论22.2 7题
    七、职业摔跤手可以分为两种类型:“娃娃脸”(“好人”)型和“高跟鞋”(“坏人”)型。在任意一对职业摔跤手之间都有可能存在竞争关系。假定有n个职业摔跤手,并且有一个给出竞争关系的r对摔跤手的链表。请给出一个时间为O(n+r)的算法来判断是否可以将某些摔跤手划分为“......
  • 算法力扣刷题记录 五十九【450.删除二叉搜索树中的节点】
    前言记录五十八【701.二叉搜索树中的插入操作】保证插的新节点在叶子节点的位置,如此实现递归。那么【450.删除二叉搜索树中的节点】删除如何实现?还有简单的方法吗?一、题目阅读给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二......
  • 算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公
    前言公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。二叉树篇继续。一、【236.二叉树的最近公共祖先】题目阅读给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一......
  • 代码随想录算法训练营第 23 天 |LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetC
    代码随想录算法训练营Day23代码随想录算法训练营第23天|LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串目录代码随想录算法训练营前言LeetCode39.组合总和LeetCode40.组合总和IILeetCode131.分割回文串一、基础1、回溯可以看成N叉树2、去......
  • 代码随想录算法训练营第 22 天 |LeetCode77. 组合 LeetCode 216.组合总和III LeetCode
    代码随想录算法训练营Day22代码随想录算法训练营第22天|LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合目录代码随想录算法训练营前言LeetCode77.组合LeetCode216.组合总和IIILeetCode17.电话号码的字母组合一、基础1、回溯可以解......
  • 计算机视觉基础:Harris角点检测算法手撕
    文章目录前言一、Harris角点检测是什么?二、算法原理1.角点及角点检测2.Harris角点检测原理3.角点的判别三、代码展示1.编程思路2.角点检测代码3.OpenCV接口调用四、可视化结果1.harris角点检测代码结果展示2.不同阈值和K值下角点检测结果比较五、实验总结前言本......