![](https://img-blog.csdnimg.cn/direct/81958cf83cbc49178082059c0f4da5a1.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
代码随想录训练营
文章平均质量分 89
一刷
Salinoia
这个作者很懒,什么都没留下…
展开
-
一刷后日谈
我是一个向来都很抗拒编程的人,那繁琐的符号让我觉得很是头疼,本科期间数据结构与算法都重修了三次,最后临近毕业才堪堪通过,本身对于编程这件事一直都是抱有恐惧的姿态,当然更多的还是疫情一年的放纵让自己和曾经那个优秀的自己渐行渐远了,一度沉湎于各种虚假的幻想中无法自拔,所幸本科还是毕业了,但由于基础太差,终究考研还是分差了一截,与全日制失之交臂,只得调剂到非全日制;是的,我从来没觉得读研开心过,哪怕是录取的那一刻; 因为自视为失败者的人不配拥抱荣耀; 大四的暑假,提前进组跟着干项目;原创 2024-05-24 00:00:31 · 451 阅读 · 0 评论 -
Day 60 84.柱状图中最大的矩形
很显然,最后返回的值一定是w*h的形式,那么这里需要满足的就是寻找一个柱子左右最小的元素,这样才能得到完整的矩阵;给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。 这道题很明显,就是接雨水的同素异形体,只是那里是求缺口,这里是求底座; 由前面说的可知,这里需要的就是单调减的栈来实现;求在该柱状图中,能够勾勒出来的矩形的最大面积。原创 2024-05-23 23:27:20 · 329 阅读 · 0 评论 -
Day 59 503.下一个更大元素Ⅱ 42.接雨水
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。 用双指针实现的话,其实和单调栈的实现思路是一样的,只是双指针法需要用两个数组来存放每个柱子对应的左右柱子的高度; 这道题用单调栈实现的话,其实还是很简单的,就是既要比较和右边的大小,又要比较和左边的大小; 模拟成环的方式其实很简单,数组扩容或者遍历取模; 其他的和上题大差不差;原创 2024-05-23 23:26:14 · 464 阅读 · 0 评论 -
Day 57 739. 每日温度 496.下一个更大元素 I
接下来用temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。输入: nums1 = [4,1,2], nums2 = [1,3,4,2].原创 2024-05-22 23:13:04 · 965 阅读 · 0 评论 -
Day 56 647. 回文子串 516.最长回文子序列
由递推公式,dp[i][j]无法由dp[i - 1][j - 1]推出,考虑dp[i][j]中i j相同时,初始化为1;如果[i + 1, j -1]区间已经成立,在s[i] == s[j]时,[i, j]区间也是回文串; 首先想到的自然是一维数组,但是找不到dp[i - 1]与dp[i]的关系; 由于dp[i][j]是由dp[i + 1][j - 1](左下角推出); dp[i][j]表示区间[i, j]的。 dp[i][j]表示区间[i, j]的。(可不连续)中的回文子串的长度;原创 2024-05-21 23:46:33 · 399 阅读 · 0 评论 -
Day 55 583. 两个字符串的删除操作 72. 编辑距离
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 和上题的删除元素不太一样的点在于,两个字符串都可以进行删除操作;其他的操作都是类似的; 1.dp数组下标及其含义 dp[i][j]: 表示word1取[0, i - 1]子序列和word2取[0, j - 1]子序列时需要最少删除dp[i][j]次可得到相同字符串; 2.递推公式 3.初始化int 4.遍历顺序 从上到下,从左到右;原创 2024-05-21 21:53:48 · 796 阅读 · 0 评论 -
Day 54 392.判断子序列 115.不同的子序列
例如: s:bagg 和 t:bag ,s[3] 和 t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。 所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]; dp[i][j]: 表示 s 的前i 个字符(s[0:i-1])中包含 t 的前 j 个字符(t[0:j-1])的不同子序列的个数; 当然也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。原创 2024-05-21 10:27:24 · 263 阅读 · 0 评论 -
Day 53 1143.最长公共子序列 1035.不相交的线 53. 最大子序和(动态规划)
dp[i][j]表示长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j];现在,我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线,只要 A[i] == B[j],且我们绘制的直线不与任何其他连线(非水平线)相交。 dp[i]表示以下标i(元素nums[i])为结尾的子序列和为dp[i]; dp[i][0]和dp[0][j]定义为0即可。若这两个字符串没有公共子序列,则返回 0。原创 2024-05-20 22:43:02 · 591 阅读 · 0 评论 -
Day 52 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾和nums[i]为结尾。,那么子序列 [nums[l], nums[l + 1], … 所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1); 如果是以下标i为结尾或者以j为结尾,则需要额外初始化dp[i][0]或dp[0][j];例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。原创 2024-05-19 22:38:11 · 958 阅读 · 0 评论 -
Day 50 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
即dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][2] - prices[i], dp[i - 1][3] - prices[i]));在dp[1][0]的推导条件下, 必然需要满足dp[0][3] == 0;很显然,dp[0][3]的定义就是非法的,但是为了满足递推公式; (注意这里自己定义的状态和代码随想录图片的不一致,自定义的1对应上图的2,自定义的2对应上图的3,自定义的3对应上图的1) 从地推公式容易看出,这里的状态1和状态2实际上是可以压缩的,原创 2024-05-17 20:13:15 · 460 阅读 · 0 评论 -
Day 49 123.买卖股票的最佳时机Ⅲ 188.买卖股票的最佳时机Ⅳ
最后返回值一定是dp[prices.size() - 1][4],因为第二次卖出的最大值已经包含了第一次的最大值;给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 由于这里至多买卖两次,所以要修改dp数组的定义。 5.打印dp数组。原创 2024-05-16 22:13:15 · 668 阅读 · 0 评论 -
Day 48 121.买卖股票的最佳时机 122.买卖股票的最佳时机Ⅱ
每天其实就是两种状态,手里有股票和手里没股票,再加上“某天”这个维度,所以用一个二维的就可以表示所有天数的情况。 如果仅仅定义为买入和卖出两种状态,就需要额外定义保持买入和保持卖出的定义,这样定义是无法通过二维数组实现的; 思路和上题大致是一致的,只有在递推公式上有小的区别,因为购入操作之前的本金不一定是零; dp[i][0]表示,第i天手里持有股票的状态下的最大利润;给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 dp[i][1]表示,第i天手里不持有股票状态的最大利润;原创 2024-05-16 22:12:21 · 874 阅读 · 0 评论 -
Day 47 198.打家劫舍Ⅰ 213.打家劫舍Ⅱ 337.打家劫舍Ⅲ
同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, dp[i]考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]; 其实和之前的那道安摄像机的题有点像的,由于题目要求不能同时取两个直接相连的房间,所以相当于是跳层遍历;给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。原创 2024-05-15 16:34:51 · 333 阅读 · 0 评论 -
Day 46 139.单词拆分
问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);,对应题目如下:动态规划:416.分割等和子集(opens new window)动态规划:1049.最后一块石头的重量 II(opens new window)问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:动态规划:494.目标和(opens new window)。原创 2024-05-14 21:08:05 · 658 阅读 · 0 评论 -
Day 45 70. 爬楼梯 (进阶)322. 零钱兑换 279.完全平方数
既然递归公式是 dp[i] += dp[i - j],那么dp[0] 一定为1,dp[0]是递归中一切数值的基础所在,如果dp[0]是0的话,其他数值都是0了。 本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j] 下标非0的dp[i]初始化为0,因为dp[i]是靠dp[i-j]累计上来的,dp[i]本身为0这样才不会影响结果。 将题目转化为,给定一个容量为n的背包,用平方数填充,填充满背包所需要的最少平方和数量数为多少;原创 2024-05-13 21:36:53 · 893 阅读 · 0 评论 -
Day 44 完全背包理论基础 518. 零钱兑换 II 377. 组合总和 Ⅳ
所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) dp[i][j]是由dp[i - 1][j]以及dp[i - 1][j - weight[i]] + value[i]推导出来的,这里的dp[0] = 1严格意义来说是解释不通的,但是由于递推公式的存在,所以只能取dp[0] = 1; 完全背包和0-1背包的最大区别在于完全背包里的每个物品的数量都是无限个,而0-1背包每个物品只有一个;原创 2024-05-11 20:06:43 · 1047 阅读 · 0 评论 -
Day 43 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。输入:[2,7,4,1,8,1]输出:1。原创 2024-05-10 22:07:11 · 1682 阅读 · 0 评论 -
Day 42 0-1背包理论基础 416. 分割等和子集
首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。 如图: 所以第一列必然是全为0,因为根本放不进东西进去; 再看递推公式: 可以看出,dp[i][j]要么是由正上方,要么是由左上方推出来; 分析第一行: dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最大价值。原创 2024-05-09 00:22:35 · 754 阅读 · 0 评论 -
Day 41 343.整数拆分 96.不同的二叉搜索树
从递归公式上来讲,dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量] 中以j为头结点左子树节点数量为0,也需要dp[以j为头结点左子树节点数量] = 1, 否则乘法的结果就都为0; 那么思路就明了了,对于n > 4的情况,尽可能的将数分解为3的和,递推公式即为dp[i] = dp[i - 3] *3; 所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]; 当①为头节点时,其右子树的布局和n= 2的情况类似;原创 2024-05-06 20:11:19 · 890 阅读 · 0 评论 -
Day 39 62.不同路径 63.不同路径Ⅱ
引入了obstacles数组,所以当初始化遇到的obstacles[i][j] == 0的时候,直接停止接下来的初始化操作; 很明显,此题为二维数组dp[i][j],含义为从dp[0][0]到下标dp[i][j]位置的所有路径。 也就小小的差别,当遍历到障碍物的时候,不改变此处的dp[i][j]的值即可,别的和上题一直; 从递归公式可以看出,每个dp[i][j]都是由左边或者上边的元素得到的;现在考虑网格中有障碍物。原创 2024-04-29 14:19:15 · 970 阅读 · 0 评论 -
Day 38 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
最直接的方法,打印dp数组,一般代码出了问题的情况dp数组肯定是有问题的;原创 2024-04-28 21:28:32 · 738 阅读 · 0 评论 -
Day 37 738.单调递增的数字 968.监控二叉树
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数; 从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]; 即以后序遍历的方式向上遍历,左右中的顺序,将叶子节点的信息返回给父节点;原创 2024-04-27 18:53:59 · 673 阅读 · 0 评论 -
Day 36 435. 无重叠区间 763.划分字母区间 56. 合并区间
要得到删除的元素数量,排序是必然的,这样方便统一比较;此处按照区间左右边界点排序都可以,若按照右边界排序,则从左往右比较,记录不重叠的区间数; 初识,真没思路,甚至想到了回溯嗯找,不得不说标记最大下标这个思路是真的巧妙,确保了每个被分割的片段必然是满足题目要求的; 和之前题目思路一样,因为只需要返回移除数组的数量,而不需要返回具体是哪个,所以直接定义计数器即可,无须真正删除元素; 思路和上一道题是一样的,排序,边界大小判断,但是会多出来一个移除元素的操作使剩余区间互不重叠;,使剩余区间互不重叠。原创 2024-04-26 18:18:50 · 925 阅读 · 0 评论 -
Day 35 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]] 插入的过程:插入[7,0]:[[7,0]]插入[7,1]:[[7,0],[7,1]]插入[6,1]:[[7,0],[6,1],[7,1]]插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]原创 2024-04-25 22:40:11 · 889 阅读 · 0 评论 -
Day 34 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。以这种方式修改数组后,返回数组可能的最大和。 第一反应:遍历数组是否存在负数,若存在将绝对值大的负数优先取反然后返回数组和,如不存在则找到最小的正数取反再返回数组和; 其实这两步就是 前者局部最优为:让绝对值大的负数变为正数,当前数值达到最大,整体最优;原创 2024-04-24 20:12:11 · 933 阅读 · 0 评论 -
Day 32 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
,如图: 如果移动下标不等于当前覆盖最大距离下标,说明当前覆盖最远距离就可以直接达到终点了,不需要再走一步。原创 2024-04-24 00:12:36 · 662 阅读 · 1 评论 -
Day 31 贪心算法理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。 针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff原创 2024-04-22 22:18:36 · 1058 阅读 · 0 评论 -
Day 30 回溯总结
回溯和递归往往是相辅相成的;void backtracking(参数) {if (终止条件) {存放结果;return;for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表);// 递归回溯,撤销处理结果。原创 2024-04-19 20:23:45 · 586 阅读 · 0 评论 -
Day 29 491.递增子序列46.全排列 47.全排列 II
组合问题无重复元素用startIndex去重,有重复元素做数层去重(used数组或者hashset); 排列问题其实本质和组合问题的处理方法本质来说是一致的,只是舍弃的节点处理方式有所区别;给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 这里还有个神奇的事,就是used[i-1] == true也可以实现; 排列问题是用used数组树枝去重; 在操作子集Ⅱ的问题的时候, 是。原创 2024-04-17 22:23:03 · 262 阅读 · 0 评论 -
Day 28 93.复原IP地址 78.子集 90.子集II
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 此处可以剪枝的条件有很多,只要切割的内容不合法了,那此树层的后序节点都不用再继续切割; 和上题的区别在于,此处的子集是。原创 2024-04-16 21:58:30 · 262 阅读 · 0 评论 -
Day 27 39. 组合总和 40.组合总和II 131.分割回文串
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 注意此处依然可以进行剪枝操作,如果得到的是一个排序数组,那只要for循环中的下一层的sum。 组合问题:选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个; 切割问题:切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段; 显而易见,此时若想进行去重操作,原数组一定是一个排序好的数组;原创 2024-04-16 20:11:59 · 660 阅读 · 0 评论 -
Day 25 组合(优化)216.组合总和III 17.电话号码的字母组合
因为这个地方是i可以取到的上界,而取的集合要求是闭区间,比如n=4,k=3的时候,当path.size() = 0时,那么[1,2,3]和[2,3,4]数组都是合法的目标数组; 例如,n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了;示例 2: 输入: k = 3, n = 9 输出: [[1,2,6], [1,3,5], [2,3,4]] 题目输入的是字符串,但是字符串中的字符同时是对应着另一组字符串的数字,所以这里要进行一个映射的操作;原创 2024-04-15 22:22:37 · 488 阅读 · 0 评论 -
Day 24 回溯理论基础 77. 组合
第一次取1,集合变为2,3,4 ,因为k为2,只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推; 回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度,如下图所示:(注意此处取的恰好是集合数和节点数一致的情况,并不是说回溯算法使用场景就是最优解) path这个数组的大小如果达到k,说明找到了一个子集大小为k的组合了,此时到达所谓的叶子节点; 这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取;原创 2024-04-12 21:05:53 · 781 阅读 · 0 评论 -
Day 23 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 总结篇
遍历和迭代的思想都要熟悉;原创 2024-04-12 09:25:20 · 1950 阅读 · 0 评论 -
Day 22 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 2.删除左不为空右为空的节点:让该节点的父节点指向左子节点; 3.删除左为空右不为空的节点:让该节点的父节点指向右子节点;原创 2024-04-10 23:21:58 · 854 阅读 · 1 评论 -
Day 21 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]提示:树中至少有 2 个节点。原创 2024-04-09 20:19:22 · 713 阅读 · 0 评论 -
Day 20 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。返回以该节点为根的子树。给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;原创 2024-04-08 23:44:58 · 597 阅读 · 0 评论 -
Day 18 513.找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
而且由于这道题的要求是返回左下角的值,所以只需要满足左子树优先遍历即可,那么前序中序后序都可以,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值; 由于题目要求得到的是最后一行的最左边的元素,则不能简单的一直向左遍历;给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 很简单,层序遍历,返回含有路径数组元素的数组;原创 2024-04-06 22:52:55 · 678 阅读 · 1 评论 -
Day 17 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
根节点的深度究竟是1 还是 0,不同的地方有不一样的标准,leetcode的题目中都是以节点为一度,即根节点深度是1; 回归到这道题,解决的思路还是求最大高度,那自然还是后序遍历(左右中),判断最大高度差是否小于等于一;本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 输出格式先不考虑其中的->,那就是先输出父节点再输出子节点,则使用前序遍历(中左右);给定二叉树 [1,2,2,3,3,null,null,4,4]说明: 叶子节点是指没有子节点的节点。原创 2024-04-05 17:24:11 · 288 阅读 · 1 评论 -
Day 16 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
在完全二叉树中(所有节点必须是“相邻”的),除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置; 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始) 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始) 由于二叉树的最大深度其实就是二叉树的最大高度,所以很多题解给出的方式实际上是最大高度的求解;说明: 叶子节点是指没有子节点的节点。原创 2024-04-04 23:12:08 · 631 阅读 · 1 评论