代码随想录算法训练营第27天 | 39.组合总和 、40.组合总和II和131.分割回文串

devtools/2024/11/15 0:42:22/

代码随想录算法训练营第27天 | 39.组合总和 、40.组合总和II和131.分割回文串

  • 自己看到题目的第一想法
  • 看完代码随想录之后的想法
  • 自己实现过程中遇到哪些困难

链接: 39.组合总和
链接: 40.组合总和II
链接: 131.分割回文串

自己看到题目的第一想法

39.组合总和:数字可以被无限选取,那么startIndex就不是像之前组合问题一样了。不管怎样先画树形图自己模拟一下流程,画树形图的时候明确了两个点:第一就是每个节点处剩下的集合是什么?第二个是树的宽度和深度由什么决定?根据回溯的算法模板和三部曲一步步写代码。
40.组合总和II: 我看示例的时候有个疑问:题目要求candidates中的每个数字在每个组合中只能使用一次,那么candidates本身有重复的数字是算一个数字还是多个数字呢?如果是多个数字,为什么在结果里不能各自区分不同?

看完代码随想录之后的想法

39.组合总和:递归函数参数:集合candidates,目标值target,path的和sum,for循环的起始位置startIndex。**什么时候用startIndex?**当每一层选取都在同一个集合时需要startIndex,因为当前path新增的元素会影响集合元素的选取,也就是for循环里变量i的起始是由递归函数上一个i决定的。这里的具体对应关系也体现在递归处理逻辑中递归函数的输入参数中对应startIndex处的变量。由于这道题目可以重复选择元素,所以函数处理逻辑里startIndex取i,而上一题不能重复选取的startIndex为i+1。
40.组合总和II:针对去重的逻辑,有一个很需要理解的点,在于树枝去重还是树层去重。树枝去重保证了单个结果中元素值不会重复,而树层去重保证了结果集合中结果不会重复。针对这道题目,单个结果中元素值可以重复而结果集合中结果不能重复,所以应该使用树层去重。树枝去重用break(直接结束循环),树层去重用continue(跳过语句进入下一次循环)。看到这里其实也解答了我的疑问,题目要求的是组合,我思考的虽然元素不同,但是对于结果集合来说,它们之间不能有重复的。怎样进行树层去重呢? 首先需要进行排序,保证相同的数位置相邻。使用标记数组来记录被选取的元素,如果当前搜索到的节点已经被访问过,也就是数值与上一个相同且上一个没有被用过,那么就直接跳过此次循环进入下一个循环。
131.分割回文串:切割问题与组合问题相似,切割线就是startIndex,注意是startIndex而不是i,i是变化的,而startIndex是不变的。结束条件就是startIndex比字符串大或者已经等于字符串长度了。如何记录切割子串呢?先判断是否是回文,需要再写一个函数判断回文,也就是从前往后开始到从后往前,字符串相同。如果是回文子串就加入path中。

自己实现过程中遇到哪些困难

39.组合总和:一些薄弱点是,第一,对于数组的增删改查API太久没有写代码忘记了。第二,对于递归函数的参数还不是很熟练,第三是对于startIndex控制剩余集合的操作不是很熟练,与上一题对比下,这一题的递归函数的startIndex不太一样。
最后一题确实难,需要反复去回顾。


http://www.ppmy.cn/devtools/33736.html

相关文章

【Qt QML】Frame组件

Frame(框架)包含在: import QtQuick.Controls继承自Pane控件。用于在可视框架内布局一组逻辑控件。简单来说就是用来包裹和突出显示其他可视元素。Frame不提供自己的布局,但需要自己对元素位置进行设置和定位,例如通过…

http请求内容

Cookie 可以包含多个键值对,因此它不仅限于单个值。一个 Cookie 可以携带多个属性,每个属性由键值对表示 Set-Cookie: namevalue; expiresSat, 30 Apr 2022 23:59:59 GMT; path/; domain.example.com; secure; HttpOnly 在HTTP协议中,请求头之…

上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们都知道,嵌入式应用一般都是为了某一个特定应用而存在的。也就是说,和pc不同,这个嵌入式板子一般都是为了解…

linux 创建管理员用户并使用生成秘钥登录服务器

一台新的云服务器,初始化登录的是root用户,现需要其他人登录该服务器但肯定不能也使用root权限登录,需要创建新的用户并给该用户生成秘钥并给与管理员的权限,通过ssh免密登录 要在Linux系统上创建新用户并赋予管理员权限(sudo权限…

Servlet(一些实战小示例)

文章目录 一、实操注意点1.1 代码修改重启问题1.2 Smart Tomcat的日志1.3 如何处理错误 一. 抓自己的包二、构造一个重定向的响应,让页面重定向到百度主页三、让服务器返回一个html数据四、表白墙4.1 约定前后端数据4.2 前端代码4.3 后端代码4.4 保存在数据库的版本…

Leetcode—422. 有效的单词方块【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—422. 有效的单词方块 实现代码 class Solution { public:bool validWordSquare(vector<string>& words) {int row words.size();for(int i 0; i < row; i) {// 当前这一行的列数int col words[i].length(…

Python将Json转为对象

1、Json简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种用于数据交换的轻量级文本格式&#xff0c;易于人们阅读和编写&#xff0c;也易于机器解析和生成。它基于JavaScript的一个子集&#xff0c;但它的语法独立于编程语言。 JSON被广泛应用于前后端数据…

接收区块链的CCF会议--APSEC 2024 截止7.13 附录用率

会议名称&#xff1a;APSEC&#xff08;Asia-Pacific Software Engineering Conference&#xff09; CCF等级&#xff1a;CCF C类学术会议 类别&#xff1a;软件工程/系统软件/程序设计语言 录用率&#xff1a;2023年&#xff0c;90 submissions were recommended for accep…