- 博客(54)
- 收藏
- 关注
原创 代码随想录算法训练营总结 | LeetCode
单调栈,顾名思义,以单调递增或者单调递减的顺序将数组的元素存入栈内。背包问题:在动态规划基础上丰富了数组含义,依旧是靠动态规划五步曲解题,不过在这一部分笔者认为需要重点搞清楚内外for循环各遍历什么,且遍历顺序是怎样的(大部分情况是外层遍历物品,内层遍历背包容量,且容量要倒序遍历,防止一个物品被放入数组多次)。打家劫舍:这类问题dp数组的下表就不是代表容量了,而是代表最多处理到这个位置,前面的那些位置要怎样处理才能使结果最优要看题目的安排(让你要间隔一个处理啊等等)。遍历顺序和打家劫舍一样,也是顺序遍历。
2023-09-12 23:45:22 448
原创 代码随想录算法训练营day60 | LeetCode 84. 柱状图中最大的矩形
思路:和昨天接雨水的题目类似。双指针做法就是记录每个节点左右两边最小的节点的下标(正好和接雨水相反);单调栈做法也是一样碰见大元素才入栈(和接雨水相反)。
2023-09-09 23:48:50 310
原创 代码随想录算法训练营day59 | LeetCode 503. 下一个更大元素 II 42. 接雨水
思路:双指针做法:从两边往中间计算,先算出对于每个节点而言,以该节点为盆底的盆左右两边的高度。然后直接for循环遍历数组求出结果。单调栈做法:每次满足条件从栈中push出来元素时,尝试构建一个盆地,计算能够装多少水(初步理解如果没有挨在一起的元素相等的情况的话,宽度为1)。思路:和昨天的单调栈做法是一样的,用一个栈存放暂未获得结果的数组元素,只不过变成了循环数组,因此需要两次for循环遍历。
2023-09-08 20:42:57 406
原创 代码随想录算法训练营day58 | LeetCode 739. 每日温度 496. 下一个更大元素 I
思路:新学习的单调栈做法,实质就是用一个栈存储中间结果。在针对数组某个元素的结果没找出来之前,将数组该元素的信息存入栈中,找到结果后,再从栈中删除该元素的信息。思路:和上题非常相似,只需在针对数组元素找到结果删除栈中该元素之际,判断该元素是否在另一数组中出现。因此本题需要用到unordered_map。
2023-09-07 20:41:36 356
原创 代码随想录算法训练营day57 | LeetCode 647. 回文子串 516. 最长回文子序列
思路:难处在于定义dp[i][j]的表示,确定了dp[i][j]代表的含义就好办了,dp[i][j]代表以下标i开始、下标j结束的字符串是否是回文字符串。那么既然这样定义,该如何用到前面已经算好了的dp数组的值呢,答案是判断dp[i+1][j-1]是否是回文串(当j-i<=1时则不必),因此遍历循环外层是倒序,内层是顺序。不过dp数组的含义改变为:dp[i][j]代表以下标i开始、下标j结尾的字符串的最大回文子序列的长度。因此,初始化的时候要先令所有长度为1的字符串的dp数组的值为1。
2023-09-06 22:03:12 280
原创 代码随想录算法训练营day56 | LeetCode 583. 两个字符串的删除操作 72. 编辑距离
思路:实际上就是求两个字符串的最长公共子序列。或者也可以换成编辑距离的理解思路(这种就是直接用动态规划解了,不用对结果做任何转换)。思路:dp最经典的编辑距离的题目了。直接按标准化流程走完。dp[i][j]含义:下标i-1结尾的字符串。和下标j-1结尾的字符串要变得相等最少要经过几次操作(删除,添加,替换)。
2023-09-05 20:26:51 590
原创 代码随想录算法训练营day55 | LeetCode 392. 判断子序列 115. 不同的子序列
类似,可以看做是其一种特殊情况。两个元素不相等的时候也可以直接dp[i][j]=dp[i-1][j]。思路:第一次做,有点没太理解。
2023-09-04 21:22:44 196
原创 代码随想录算法训练营day53 | LeetCode 1143. 最长公共子序列 1035. 不相交的线 53. 最大子数组和
思路:要注意如果不相等要dp[i][j] = max(dp[i-1][j], dp[i][j-1]),相等的话就直接dp[i][j] = dp[i-1][j-1]+1而不是取某些值中的最大值。思路:不能说毫不相同,只能说和上题一模一样。思路:和贪心的做法类似。
2023-09-02 22:02:45 308
原创 代码随想录算法训练营day52 | LeetCode 300. 最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
依然是dp数组构造四部曲:1.确定dp数组的含义;3.确定dp数组初始化;直接拿nums[i]和nums[j]进行比较,如果nums[i]>nums[j]就取max(nums[i],nums[j]+1)。思路:两种做法,基础版二维dp数组,比较相等,类似于上题目的做法,碰到相等dp[i][j]=dp[i-1][j-1]+1。进阶版一维dp数组做滚动,内层for循环——对应背包容量循环,需要做倒序便利,并且不是每次取最大值,而是直接dp[j]=dp[j-1]+1,如果不相等,还要额外做赋0的操作。
2023-09-01 21:03:35 276
原创 代码随想录算法训练营day51 | LeetCode 309. 买卖股票的最佳时机含冷冻期 714. 买卖股票的最佳时机含手续费
思路:增加了一个冷冻期,原本的二维数组dp的第二维的长度就要从2变为4,依次代表:0持有股票的状态、1从很早开始就不持有股票的状态、2今天刚把股票卖掉、3昨天刚把股票卖掉,今天为冷冻期。其实也可以将1状态和2状态合为一个状态,那么碰到今天本不持有股票状态(情况2带来的结果),想买入一只股票时,并不违法。(好像按照规定卖完一只股票后不能立马又买入一支股票,但是看运算结果我们就会发现对应+prices[i]-prices[i],说明通过这样来持有的股票,dp[i][0]=dp[i-1][0])。
2023-08-31 20:08:16 239
原创 代码随想录算法训练营day50 | LeetCode 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV
思路:依旧是dp的股票类问题,题目说最多可以买卖两次,那么就定义一个二维的dp数组,第一维长度依然是数组长度,第二维长度为2*2=4,依次记录到某个节点时第一次持有股票、第一次不持有股票、第二次持有股票、第二次不持有股票的情况。思路:由二次买卖股票进阶到k次,那么处理结果也是一样的,就把二维dp数组的第二维的长度修改为2*
2023-08-30 20:11:19 238
原创 代码随想录算法训练营day49 | LeetCode 121. 买卖股票的最佳时机 122. 买卖股票的最佳时机 II
思路:和上题类似,区别在于股票可以买卖多次,因此计算某个节点持有股票或者不持有股票时都要把本节点和以往结果做比较。例如对dp[i][0]进行赋值时,就要考虑是保持以往的持有数据好,还是在以往不持有股票的情况下购买此次的股票好。思路:定义一个二维dp数组,第二维长度为2,用来记录到每个节点时,持有股票或不持有股票情况下手里的现金。
2023-08-29 20:31:33 241
原创 代码随想录算法训练营day48 | LeetCode 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III
思路:dp题除背包外的另外一类题目,重点不在于看前面的情况,而在于考虑本节点的情况。另一种情况,不选择本节点,看哪种情况下的值最大。初始化也有所不同,不是简单地dp[0]=0,dp[1]=1诸如此类,dp[1]要考虑dp[0]的大小才能决定。思路:环形数组,第一次见dp中这样的设置,其实很简单,总体上考虑两种情况:情况一:考虑除数组头外的其他所有元素;思路:树形dp,dp的做法和二叉树的遍历的做法没有很大差异,或者说dp的做法就是基于二叉树的遍历做了一点点的改进,只是为了让它更像是动态规划。
2023-08-28 21:24:55 531
原创 代码随想录算法训练营day46 | LeetCode 139. 单词拆分
思路:又是一种不同形式的背包问题,求一个字符串是否能由字符串数组中的若干字符排列组成。首相想到排列,所以要外层遍历背包容量for循环,内层遍历物品for循环。但是又不是简单的用dp数组解决排列组合的问题,而是求是/否的问题。因此dp数组初始化全false,遍历途中如果发现容量为j的背包可以由数组中的物品加上之前确定了的物品构成,那么dp[j]就赋值true。
2023-08-26 14:02:23 592
原创 代码随想录算法训练营day45 | LeetCode 70. 爬楼梯 II 322. 零钱兑换 279. 完全平方数
思路:之前没有碰到过求最小值的完全背包问题,要注意进行最小值赋值时的条件判断。思路:和上题基本一样,只是为什么这里不用条件判断(这里挖个小坑)思路:用完全背包的方法做,比斐波那契数列的做法显得高大上一点。
2023-08-25 19:33:40 275
原创 代码随想录算法训练营day44 | LeetCode 518. 零钱兑换 II 377. 组合总和 Ⅳ
今晚学习了完全背包的做法,和01背包的差别具体来说就是一个可以重复,一个不可以重复。体现在数组的遍历中来说就是完全背包不能用二维数组做法(因为二维dp数组一定不会重复,但是还没验证过),只能用一维dp数组,且背包容量for循环必须是顺序遍历,这样可以方便重复。碰到组合问题时,物品循环放外面,背包容量循环放里面;碰到排列问题时,背包容量循环放外面,物品循环放里面。(如果物品循环放外面,那么物品的顺序一定是固定了的,从前往后)思路:典型的完全背包组合题。思路:典型的完全背包排列题。
2023-08-24 21:22:49 406
原创 代码随想录算法训练营day43 | LeetCode 1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
所以还是用dp做,关键在于dp的构造,细想其实可以得到这个式子:left-right=targt, left+right=sum,可以推出left=(sum+target)/2,这就好办了,left即为我们的背包最大容量。(但此题与其他不同的是,他不是每次都去比较拿最大值,而是一直做加法,我的理解是实际还是做的排列组合)思路:把全部石头重量加起来,然后除以二,就等于背包的最大容量。然后就可以按照背包问题做,再将石头总质量减去背包最大容量得到的差减去背包里面的值,就是可以得到的最小结果。
2023-08-23 21:59:58 556
原创 代码随想录算法训练营day42 | LeetCode 416. 分割等和子集
今天主要学习了一下01背包的二维数组和一维数组的做法,二维数组比较好理解,根据每次将不将物品i放入背包来充分的用到前面的数据遍历数组。二维数组遍历的时候,里层for循环是升序遍历的,而到了一维数组遍历的时候,里层for循环是降序遍历的(这主要是为了不让一个物品被重复放入背包)。思路:不看答案还真没有思路,最近几天的题目都体现着认知的差距,在知道题目解法的同时却很难给出实现方案,还是得多练。本题思路:背包容量为数组和的1/2,如果能够从数组中去除若干个数,使其和恰好为数组和的1/2,那么就满足条件。
2023-08-22 21:28:23 509 1
原创 代码随想录算法训练营day41 | LeetCode 343. 整数拆分 96. 不同的二叉搜索树
那么就好做文章了,节点多的二叉树一定是由节点少的二叉树构造而来,但是如何构造呢,在所有能插入节点的位置插上节点吗(计算原二叉树有多少个空节点?)实则不然,这样做太麻烦了。应当考虑根结点的左右子树,每次安排给他们不同的节点数量,这样实现就和上题类似了,一个一维数组dp,两层for循环。依旧和往常一下,建立dp数组,dp[n]的值一定取决于dp[n-1]的值,上次做到过二维的dp数组,这次虽然还是一维dp数组,但是完整的数组构建确是经过了两层for循环,相当于时间复杂度同为O(n^2)。
2023-08-21 19:57:33 190
原创 代码随想录算法训练营day39 | LeetCode 62. 不同路径 63. 不同路径 II
思路:遇到障碍dp[i][j]就赋值0,其他都是类似。比较容易漏掉的一点是,初始化的时候,也就是给dp数组第一行和第一列全部赋值1的时候要判断途中是否出现障碍物,若出现,后面的位置就都到不了,需要全部赋值为0.思路:整体思路是一样的,找到状态转移公式和初始化处理。不过这题开始dp数组变成了二维,需要着重考虑初始话特殊条件判断。
2023-08-19 18:44:44 838
原创 代码随想录算法训练营day38 | LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
思路:一个套路,先确定状态转移公式,然后初始化,最后遍历一遍即可。思路:直接用递归做会超时,说明不断地读写栈内存还是蛮耗时的。思路:经典的dp题。
2023-08-18 19:31:03 398
原创 代码随想录算法训练营day37 | LeetCode 738. 单调递增的数字 968. 监控二叉树
思路:从后往前考虑,题目会变得很容易,从前往后考虑,结果很难处理。
2023-08-17 22:30:09 372
原创 代码随想录算法训练营day36 | LeetCode 435. 无重叠区间 763. 划分字母区间 56. 合并区间
思路:重叠区间的经典题,和昨天最后一题类似,找到重叠在一块儿的(必须每个区间的交集存在不为空),计算整个数组有多少堆这样重叠在一块儿的,就说明经过移除,最多可以剩下多少互不重叠的区间。思路:可以不不构造正规的放starti和endi的数组,只需记录每个字母最后出现的位置,相当于endi,这样可以不用构造二维数组,一维数组数组就够了。思路:可以总结发现这种计算重叠区间的题目,完全都是一个套路,先将区间按照starti或者endi排序,然后遍历一遍,过程中计算是否重叠。
2023-08-16 21:19:04 214
原创 代码随想录算法训练营day35 | LeetCode 860. 柠檬水找零 406. 根据身高重建队列 1452. 用最少数量的箭引爆气球
其实很简单,只需将数组按照Xstart进行升序排序,然后每次比较points[i]的Xend和points[i+1]的Xstart是否重叠,重叠了的话意味着这两个气球可以一箭射穿,因此还需往后找看是否还有重叠的,因此需要将points[i]和points[i+1]的Xend中最小的那个赋值给points[i+1](数轴上最靠左边的),让points[i+1]继续和后面的进行比较。需要意识到的关键点是:矮个子的插入是不会影响高个子的。构建新数组时,从高个子开始插入,按照ki将其插入到新数组的指定位置。
2023-08-15 21:19:10 145
原创 代码随想录算法训练营day34 | LeetCode 1005. K 次取反后最大化的数组和 134. 加油站 135. 分发糖果
思路:贪心的题目果然是能想到就很简单,想不到就是死磕也磕不出来,直接一个正反遍历就能解出答案,需要注意的是第二次反向遍历的时候要先判断前面元素是否大于后面元素,如果大于就不用再加了,不大于的话就等于后面元素+1。思路:每次都将数组中最小的数取反,即可得到和最大的数组。(其实也可以不用每次都调用冒泡排序算法,因为每次之改变了一个值,直接一个for循环找到位置插入就可以了)。思路:一开始想到的两层for循环方法始终超出时间,后来看了贪心的做法,只在一个for循环里每次curSum变成负数就重新记录起点。
2023-08-14 22:34:26 233
原创 代码随想录算法训练营day32 | LeetCode 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II
思路:比上题稍难,主要是要从结果往回看,从数组结尾往回遍历,每次取只经过一次跳跃能到达当前数组结尾的最前面的数组下表作为新的结尾,直到当前结尾==0,也就是说遍历到了数组的起点,说明此时从后往前依照每次跳跃最大原则找到了一条从数组起点到数组结尾的路径。思路:把每次局部递增时的前后元素差值算出来,结果即位这些所有差值的和。
2023-08-12 19:25:02 243
原创 代码随想录算法训练营day31 | LeetCode 455. 分发饼干 376. 摆动序列 53. 最大子数组和
思路:这题稍有难度,体现在前后元素值相等的情况下的处理,不必记录前后数值相等情况下的差值(如果记录了,会导致后续数字插值与0相乘结果仍为0,这样就判断不出后续紧接着的两个数字是否合法)。思路:经典的贪心算法题目,连续记录子数组的和,发现小于0后重新开始记录,记录过程中不断更新记录到的最大值。该题也可用dp做,今天简单回忆了一下dp做法:遍历数组过程中不断更新dp[i]的值(dp[i]代表该数组从0到i的具有最大和的连续子数组的和),最后返回dp数组中的最大值即可。
2023-08-12 17:09:52 222
原创 代码随想录算法训练营day30 | LeetCode 332. 重新安排行程
思路:比较特殊的一种回溯树,难点在于如何每次选取排名靠前的字符串,如果直接遍历需要将整个数组遍历完才行,并且每次选取新的字符串的时候都要选取,耗时非常大。比较高效的方法是用unordered_map和map的组合先将数组中的数据全部copy过来,然后每次从里面找,用一次次数就减一。
2023-08-10 22:26:23 126
原创 代码随想录算法训练营day29 | LeetCode 491. 递增子序列 46. 全排列 47. 全排列 II
思路:子集问题,需要收集整颗树的节点(根据题目要求元素的个数至少要两个,所以要收集深度大于等于2的节点),这题有点小坑,就是不能将数组排序,因此无法用startIndex+1的方式来进行层内的去重(但是仍需要startIndex+1的方式来保证节点是数组从前往后遍历的)。同一路径需要保证所用到的元素是唯一的(数值可以相等,因为数组有相同值元素,但是下标唯一),因此仍然需要vector<bool>uset(nums.size(),false)用来记录每个元素的使用情况,保证每次添加唯一。
2023-08-09 21:47:36 197
原创 代码随想录算法训练营day28 | LeetCode 93. 复原 IP 地址 78. 子集 II 90. 子集 II
思路:和昨天做过的切割回文串题目类似,都是回溯的切割类题目(剪枝树的叶子节点的集合就是结果),只不过判断条件变成了判断是否合法数字,同理,先判断,再进递归,终止条件从切割到数组末尾变成插入了三个“.”分割符。思路:和上题类似,就是要进行树层去重(因为数组含有重复元素),保证同一层从不同数值开始遍历,但是同一条路径上可以有重复的。思路:很经典的求子集的题目,答案就是树的所有节点。
2023-08-08 21:41:00 187
原创 代码随想录算法训练营day27 | LeetCode 39. 组合总和 40. 组合总和 II 131. 分割回文串
思路:还是要牢记先剪枝(先判断,满足条件再进行下一轮遍历),否则从从底层根据判断条件返回会加大工作量。(另一种时间复杂度更优的做法:先构造出判断回文字符串的数组,然后再进行递归遍历)。思路:这题比上题难在需要树层去重(忘记和之前树的哪题非常相似了,都是需要不能重复从同一值开始遍历(就是说同一层都需要从不同值开始进行遍历),但是下一层遍历的值可以和本层一样)。思路:排列组合的经典题目,此题不需要树层去重(题目说了无重复数组)。
2023-08-07 22:26:26 286 1
原创 代码随想录算法训练营day25 | LeetCode 17. 电话号码的字母组合
思路,纯纯暴力题,非要搞个每个数字对应字符串长度不统一(就没办法写出通用函数根据数字计算返回字符串了),剪枝都不用减。
2023-08-05 19:39:14 204
原创 代码随想录算法训练营day24 | LeetCode 77. 组合 216. 组合总和 III
思路:和上题没有太大差别,也是从给定数中挑选组合,就是需要额外参数记录之前所选数的和,另外剪枝可以写的更丰富,遍历到某个数,判断当前所选数的和是否明显太小或者太大,而不是一直算完发现太大了或者太小了才返回。另外一个剪枝操作就是普遍要写的——当剩余的数的数量恰好够满足条件k时,就不要再让其一个一个挑了,直接一遍遍历即可。这道典型的排列组合题,直接递归遍历,顺便在进入递归前进行一下剪枝操作。不知不觉二叉树就这么过了,总有点意犹未尽的感觉,感觉自己肯定还没有牢牢掌握所有重点,浅浅复习一下子。
2023-08-04 22:35:11 166
原创 代码随想录算法训练营day23 | LeetCode 669. 修剪二叉搜索树 108. 将有序数组转换为二叉搜索树 538. 把二叉搜索树转换为累加树
思路:有被难到这道题,一开始考虑的就是删除某个不满足的节点后左右子树怎么处理,其实只要处理该节点的左子树或者右子树(可以细想一下),另一颗子树直接删掉就好了,麻烦就麻烦在进入子树之后,以该节点为根节点的左右子树又该怎么处理,想来想去没想出来,后来看了解析,我开始的这种方法天然对应迭代法,因为该根节点满足条件,只要把左子树中太小了的删掉就可以了,这就只要删除最左边的那些节点就可以,右子树就只要删除最右边那些太大了的即可。思路:简单的用数组构造二叉树,每次取数组中间的值生成根节点即可构造平衡树。
2023-08-03 22:57:51 291
原创 代码随想录算法训练营day22 | LeetCode 235. 二叉搜索树的最近公共祖先 701. 二叉搜索树中的插入操作 450. 删除二叉搜索树中的节点
又学习到一种很新颖的做法(对普通二叉树同样适用),就是只做一种删除操作(针对右子树为空的时候),否则就将该节点与右子树中最左下角的节点交换,途中可能会交换多次,最后一次一定会把要删除的节点换到叶子节点(右子树为空),这时候直接删除就可以了,因为这种交换最多使得要删除的节点的值不满足二叉搜索树的大小顺序,所以可以适用于二叉搜索树。后来看了解析,直接从上到下,一条路径遍历到叶子节点,就可以确定插在哪里了,唯一要考虑的就是拿一个指针记录前一个节点,插入的时候做比较看是插在右节点还是插在左节点。
2023-08-02 22:07:05 127
原创 代码随想录算法训练营day21 | LeetCode 530. 二叉搜索树的最小绝对差 501. 二叉搜索树中的众数 236. 二叉树的最近公共祖先
思路:因为是二叉搜索树,所以只遍历一次即可,碰到相同节点计数,如果某次计数最大,就将前面存储好了的值全部丢掉,把本次计数最大对应的节点的值存下来(本来我是用stack存放中间结果,最后再一次性倒进vector的,后来看了卡哥解析才知道可以直接用vector,每次清空的时候直接vector.clear()就可以了)。思路:因为是二叉搜索树,所以只需要额外用一个指针保存前一个指向的节点,每次遍历将本节点与前一个节点的值相减得到差值,遍历完整颗二叉搜索树,就可以得到结果。
2023-08-01 23:00:14 127
原创 代码随想录算法训练营day20 | LeetCode 654. 最大二叉树 617. 合并二叉树 700. 二叉搜索树中的搜索 98. 验证二叉搜索树
思路:这道题只想到了递归的做法,因为需要随时记录要用到数组的哪一段(并且该段还具有回溯性),因此没法用迭代法,明确了用递归法做后,要考虑的就是递归函数的参数传递了,因为用到了数组作为参数,所以在函数体内部不需要构造新数组,只需在递归函数参数传递时记录这次遍历要用到的起点到终点索引就可以了。思路:找到满足条件的就返回,典型的用递归做,并且需要返回值,不能让递归函数一直遍历下去(这样会增加无谓耗时),因为是二叉搜索树,所以只要遍历到第一处叶子节点即可知道结果。
2023-07-31 21:43:17 137
原创 代码随想录算法训练营day19 | LeetCode KMP匹配
今天复习了一下kmp匹配算法,做了一下字符串匹配的题和判断字符串是否由子串重复构成的题,加深了印象。
2023-07-30 19:29:37 107 1
原创 代码随想录算法训练营day18 | LeetCode 513. 找树左下角的值 112. 路径总和 106. 从中序与后序遍历序列构造二叉树
思路:典型的二叉树便利题,可以考录用递归或者迭代,递归的话就是正常的前序遍历或者中序遍历,但是都需要定义一个全局变量记录深度,当每第一次达到最大深度时(遍历到叶子节点的时候)记录该节点的值。迭代就是用层序便利了,每次拿出每层第一个节点的值记录下来,当层序遍历完,最后一次赋的值也就是数左下角的值了。思路:典型的回溯法,首先讲递归的做法,每次迭代要传给子树的参数包括节点指针、到本节点为止的值的和,遍历到叶子结点时进行判断。第二种迭代的做法,其实有点画蛇添足,比递归做法要复杂不少,但也算锻炼对树的遍历算法练习。
2023-07-29 20:30:35 191
原创 代码随想录算法训练营day17 | LeetCode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
思路:首先想到的就是递归做法,每次判断两颗子树的高度差是否大于1,是则返回-1,否则返回较大值+1作为本树的高度,需要注意的是如果一个结点的左右子树都不平衡的话,也就是它们的返回值都为-1,那么此时-1-(-1)=0<1,很可能误认为该节点为根结点的这颗树就是平衡树,所以在进行左右子树高度差判断之前,应该先分别判断左右子树的返回值是否为-1.思路:要注意只有遍历到了叶子结点才算一条完整路径。递归遍历的时候,把还未完善的路径字符串作为参数接受能够降低空间复杂度,这样就不用额外用一个栈来存放中间路径字符了。
2023-07-28 22:53:44 141 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人