当前位置: 首页 > news >正文

代码随想录训练营第二十三天 39组合总和 40组合总和II 131分割回文串

第一题:
原题链接:39. 组合总和 - 力扣(LeetCode)

思路:

终止条件:

用一个sum值来记录当前组合中元素的总和。当sum的值大于target的时候证明该组合不合适,直接return。当sum的值等于target的时候将组合添加到组合集合中。

for循环中注意本题中的元素是可以重复选取的,因此下层递归中的startIndex还是i。

剩下的就是回溯的模板。

代码如下:

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

第二题:

原题链接:40. 组合总和 II - 力扣(LeetCode)

思路:

本题要注意的是去重的逻辑。

首先我们对数组进行排序,让相同的元素紧挨着。方便我们进行去重的逻辑。

Carl提到了树层和树枝去重的概念,这个概念很便于理解。本题要注意的就是树层去重的逻辑。树枝上不需要去重,因为树枝上的元素对应的是不同的元素。而树层上的元素必须要去重,因为在树枝上前一个相同的元素的遍历会包含当前元素的所有遍历结果,因此如果在同一层中当前的元素和前一个元素相同并且前一个元素没有被使用过的情况下,该元素直接跳过。

同时我们需要一个bool类型的数组来记得什么元素已经使用过了。当我们使用过的话将该数组对应的位置置为true;

代码如下:

class Solution {
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());vector<bool> used(candidates.size(), false);backtracking(candidates, target, 0, 0, used);return res;}
private:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used){if(sum > target)return;if(sum == target){res.push_back(path);return;}for(int i = startIndex; i < candidates.size(); i++){if(i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false){continue;}path.push_back(candidates[i]);used[i] = true;sum += candidates[i];backtracking(candidates, target, sum, i + 1, used);used[i] = false;sum -= candidates[i];path.pop_back(); }}
};

第三题:

原题链接:131. 分割回文串 - 力扣(LeetCode)

思路:

需要一根指针来指向当前分割的位置。

for循环是用来看在以startIndex为分割线,以i为结束的子串是否为回文串。

在递归的逻辑中是将startIndex的位置向后移动一位。

代码如下:

class Solution {
public:vector<vector<string>> partition(string s) {backtracking(s, 0);return res;}
private:vector<vector<string>> res;vector<string> path;void backtracking(string s, int startIndex){if(startIndex == s.size()){res.push_back(path);return;}for(int i = startIndex; i < s.size(); i++){if(!isHuiwen(s, startIndex, i)) continue;string st = s.substr(startIndex, i - startIndex + 1);path.push_back(st);backtracking(s, i + 1);path.pop_back();}}bool isHuiwen(const string& s, int start, int end){while(start < end){if(s[start] == s[end]){start++;end--;}else{return false;}}return true;}
};

http://www.lryc.cn/news/386726.html

相关文章:

  • 【C++】数组、字符串
  • MySQL InnoDB支持几种行格式
  • Day6: 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
  • kubekey 离线安装高可用 kubernetes 集群
  • 大数据面试题之Hive(2)
  • 求推荐几款http可视化调试工具?
  • Python逻辑控制语句 之 判断语句--if else结构
  • word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法
  • 8.javaSE基础进阶_泛型generics(无解通配符?+上下界统配符superextends)
  • 酒店客房管理系统(Java+MySQL)
  • S32K3 --- Wdg(内狗) Mcal配置
  • LeetCode 算法:二叉树的层序遍历 c++
  • 博途TIA Portal「集成自动化软件」下载安装,TIA Portal 灵活多变的编程环境
  • 火了10年的电脑监控软件有哪些?盘点8款热门的电脑监控软件
  • 入门Java爬虫:认识其基本概念和应用方法
  • Flask新手入门(一)
  • Grafana-11.0.0 在线部署教程
  • pytorch-01
  • 梦想CAD二次开发
  • Eureka的介绍与使用
  • ChatGPT之母:AI自动化将取代人类,创意性工作或将消失
  • 【深度学习驱动流体力学】湍流仿真到深度学习湍流预测
  • 如何从0构建一款类似pytest的工具
  • 6.27-6.29 旧c语言
  • Unidbg调用-补环境V3-Hook
  • 从AICore到TensorCore:华为910B与NVIDIA A100全面分析
  • Edge 浏览器退出后,后台占用问题
  • 实验八 T_SQL编程
  • 【爆肝34万字】从零开始学Python第2天: 判断语句【入门到放弃】
  • React 19 新特性集合