自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 收藏
  • 关注

原创 二刷力扣——单调栈

二维撒。

2024-07-04 11:33:32 649

原创 二刷力扣——DP算法(子序列问题)

所以挨个遍历nums数组来更新这个d数组,注意这个d数组是动态的,不像之前动态规划的DP数组,我们得记录他的长度,因为遇到了nums某元素比d最后的结尾还大,就要把这个某元素加入到d数组,扩大d数组。遇到3比d 的结尾8要小,所以更新d 的某个元素,找到比3大的&最接近3 的元素是6,so替换。所以在过程中,d数组长度不会减少,所以p数组装的nums元素 的个数,就是所要求的最长递增子序列长度,d数组的最后结尾元素代表了一条递增最慢的子序列,所以这个元素的下标,也就是len就是结果。

2024-06-26 13:07:06 820

原创 二刷力扣——DP算法(背包问题)

不是计算n次,而是每一次都计算平方,如果是奇数,就需要单独乘一个矩阵。然后a变成了m^2,5右移变成2,if里面不成立,a再平方变成m^4,2右移变成1;这里M的构造,使得(f(n+1),f(n))能够转换成各自都下标减一的向量,这是矩阵的 dp数组。从而把下标较小的那一个向量再转换为M×下标更小的向量,最后会递推成(f(n+1),f(n))与( f(1),f(0) )的关系。之后确定递推公式,很多都是看第n步之前的第n-1步的情况,然后来分类讨论第n步怎么根据第n-1步的情况得到值。

2024-06-11 14:18:39 1230

原创 二刷力扣——贪心算法

解决方法:得先满足胃口小的孩子,所以得排序;要用双指针的办法的话,指针一直往前走,g不排序不行,比如:g=3,2,1;所以都排序,遇到可满足的就count++,i++;遇到不可满足的就看下一块饼干:j++。,所以大家了解贪心算法 就了解它没有规律的本质就够了。如果每步最优解不能保证到达全局最优,就不能用。贪心算法其实就是没有什么规律可言。

2024-05-29 16:56:48 1088

原创 二刷力扣——回溯

但是从回溯开始,题目不会特别说明你要用哪种方法,回溯、穷举还是DP等,需要自己判断。所以有多种方法的最好都看一看,加深方法的理解,面试的时候可不会提示用什么方法。,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。只要有递归,就会有回溯,之前的二叉树很多递归,其实也跟上面的一样,只不过没有处理节点和撤销的操作。,这样就把这棵树全遍历完了,一般来说,搜索叶子节点就是找的其中一个结果了。

2024-05-18 14:55:47 762

原创 强化学习RL学习

总的而言,Agent依据策略决策从而执行动作action,然后通过感知环境Environment从而获取环境的状态state,进而,最后得到奖励reward(以便下次再到相同状态时能采取更优的动作),然后再继续按此流程“依据策略执行动作-感知状态--得到奖励”循环进行。基于策略的方法,一般先进行策略评估,即对当前已经搜索到的策略函数进行估值,得到估值后,进行策略改进,不断重复这两步直至策略收敛。进一步,RL为得到最优策略从而获取最大化奖励,有。[奖励函数(状态,动作)] }总之,TD结合了DP和MC,

2024-05-16 22:05:30 674

原创 二刷力扣——二叉树

迭代遍历。学会一种颜色遍历法:前中后3种就改一下入栈顺序(遍历顺序倒过来)就OK,非常统一。不过空间比普通迭代多一点,因为stack存储的是pair。

2024-04-19 16:04:34 656

原创 二刷数组理论基础,二分查找,双指针法_移除元素

【代码】【无标题】

2024-03-26 11:07:32 720

原创 力扣● 84.柱状图中最大的矩形

当发生上面那种情况:数组里面存在这种连续递减的序列,而且这个序列的第一个元素进去的时候栈为空,就会持续上面的过程,所以方法是:在heights数组前面加一个0,这样栈里面永远都不会为空,不会跳过计算面积的过程,计算的时候left就为0,意味着栈顶左边没有比自己小的元素,这个矩形就从自己开始,到right-1。1入栈,2更大,入栈;5入栈,4更小,得到right(1),mid(0),要得到left次栈顶,5出栈,栈则为空了,没有left,会跳过计算面积的过程,那么maxarea为0;

2024-03-23 15:15:29 479 1

原创 力扣● 503.下一个更大元素II ● 42. 接雨水

对于每个元素,都从左、从右找最大高度的柱子lheight、rheight,所以外层循环是0到n-1,内层循环从i往左,然后从i往右找最大高度的柱子lheight、rheight,最多会查找n次。依据列来计算更好理解,能引入单调栈:可以看出,因为左侧最高柱子和右侧最高柱子肯定不会存储雨水(左侧和右侧包含自己,因为自己是一侧最高的话不会存储雨水),所以每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度。与496.下一个更大元素 I的不同是要循环地搜索元素的下一个更大的数。

2024-03-22 19:04:11 407

原创 力扣 739. 每日温度 & 496.下一个更大元素 I

(1)T[i]>T[st.top()]:目前是单调递增栈,都遵循这3个操作的话,i是top元素右边比自己大的第一个元素,所以可以得到result[st.top()]。现在得让i入栈,要满足这个栈仍然是单增栈,所以top出栈之后,还要接着比较栈顶和i,如果i还是>top的话,还得pop,并得到得到result[st.top()]……设置单调栈,同样是递增的,而后遍历nums2,根据上面的逻辑来进行出栈入栈,同时检查当前元素i在nums1中的下标j,然后更新result[j],j不存在不操作。

2024-03-21 21:35:27 491

原创 ● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

又:dp数组不统计个数,而是判断是否是回文子串的话,比较好推导递归关系:因为根据回文子串的定义,如果下标1、2、3组成的子串是回文串,那么只需要下标0和4的字符相等,就可以判定为回文子串。参照上图,如果s[i]==s[j]而且中间的子串[i+1,j-1]是回文子串的话,那么[i,j]子串肯定是回文子串。又因为dp[i][j]是否为true取决于dp[i+1][j-1],[i+1,j-1]是在[i,j]的左下角,说明需要先把左边所有列的dp更新,所以先要从上到下,再从左到右。● 647. 回文子串。

2024-03-19 23:03:41 373

原创 力扣● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 编辑距离总结篇

都删除的话,dp[i][j]代表的子序列和dp[i-1][j-1]代表的子序列删除的字母,就多了2个:word1[i-1]和word2[j-1],所以是dp[i][j]=dp[i-1][j-1]+2;①可能删掉word1[i-1],那么dp[i][j]代表的子序列和dp[i-1][j]代表的子序列删除的字母,就多了一个:word1[i-1],所以dp[i][j]=dp[i-1][j]+1;word2[0,-1]:空串。②可能删掉word2[j-1],同样,dp[i][j]=dp[i][j-1]+1;

2024-03-15 14:35:00 371

原创 力扣● 392.判断子序列 ● 115.不同的子序列

● 1143.最长公共子序列 ● 1035.不相交的线 都没有说明2个字符串的长度谁大谁小,所以2种情况都有可能,但是这道题s比t短,只可能s[i-1]和t[j-1]之前的相等。所以画这一条线的话,只可能是垂直(dp[i-1][j-1]+1),或者偏向一个方向(dp[i][j]=dp[i][j-1])。我们知道● 1143题,如果A[i-1]等于B[j-1]的话,dp[i][j]直接就是dp[i-1][j-1]+1。是不以A[i-1]/B[j-1]为结尾的。so绕一下,用昨天的● 1143.

2024-03-14 16:26:55 585 1

原创 力扣● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

一样,dp[i][j]应该在上一个公共子序列的基础上+1,那么上一个最长的公共子序列是哪一个,如果是dp[i][j]的定义是以A[i-1]/B[j-1]为结尾的子序列,那么要求上一个最长的公共子序列,dp[][]的两个下标有可能是[0,i-1]和[0,j-1]的任何一个值,所以这时两层循环里面还要有两层循环,肯定会超时。所以按照dp[i][j]正确的定义,如果A[i-1]==B[j-1]的话,上一个最长的公共子序列就是dp[i-1][j-1]代表的,所以dp[i][j]=dp[i-1][j-1]+1。

2024-03-12 14:58:36 1061

原创 力扣● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

所以递推公式只考虑nums[i]比nums[j]大的情况,一开始,j=i-1,这个序列里面只有i自己,所以dp[i]=1,然后从后往前依次比较要不要加入j的子序列,有可能i加入j的这个子序列后长度更大,长度是dp[j]+1;所以dp[4]=2。如果nums[i]比nums[j]小或者相等,那么就不能把nums[i]拼到nums[j]结尾的序列上,即不能根据dp[j]得到dp[i],因为dp[i]一定是。所以dp[i]应该取这两个的较大值:dp[i]=max(dp[j]+1,dp[i]);

2024-03-10 20:34:43 365

原创 复习C的内存管理

C语言是音视频开发所必须的。是一段连续内存空间的别名。变量的是固定内存大小的别名。但是类型不是只确定了变量内存大小,还确定了变量是小数、整数还是字符。linux32下的C的内存模型:程序指令程序数据。。。数据区域可读写,代码区域只可读,所以分区之后呢,可以将程序指令区域和数据区域分别设置成可读可写或只读。这样分有利于防止代码篡改。

2024-03-09 23:53:11 915

原创 ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

题目与122.买卖股票的最佳时机II相比 ,就是加了一个手续费的问题,那么完成一次买卖,可以是卖一次就减去一次手续费,即最大金额dp[i][1]减去手续费fee;今天持有股票,有可能前一天持有,有可能前一天的昨天卖掉了,有可能前一天的前天以前卖掉了,不可能前一天当天卖掉,所以dp[i][0]=max(dp[i-1][0],max(dp[i-1][2],dp[i-1][3])-prices[i]);(不包含)还未买入股票的日子。所以dp[i][3]=max(dp[i-1][2],dp[i-1][3]);

2024-03-09 14:41:07 389

原创 ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

但是这里对买卖次数有限制,所以整个过程是可以分为不操作,第1次持有,第1次不持有,第2次持有,第2 次不持有。dp[j][0]:不操作。

2024-03-08 20:47:06 845

原创 ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

所以dp[j][0]=max( dp[j-1][0], dp[j-1][1]-prices[j])。没有股票,第j天不买入,为dp[j-1][1]。所以dp[j][1]=max( dp[j-1][0]+prices[j], dp[j-1][1])。刚开始现金是0,下标为0的时候对应第一天,第一天只能持有股票,所以dp[0][0]=-prices[i],dp[0][1]=0(不会覆盖后面dp[j][1]取max).dp[j][1]=max(dp[j-1][1],dp[j][0]+prices[j])。

2024-03-07 19:45:12 365

原创 ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

前1个房屋偷到的金额之和是nums[0],第2个房屋偷到的金额之和是max(nums[0],nums[1])。递推公式要得出dp[i],就是要确定第i个房屋是否打劫,那么也跟之前的背包问题一样,放与不放,对应的是两种结果,我们只需要取这两种结果的最大值就行,而不需要用if-else语句来判断放和不放两种情况。第i个房屋被打劫,肯定前一个房屋不能被打劫,所以dp[i]=dp[i-2]+nums[i]。因此dp[i]是这两个数的最大值:dp[i]=max(dp[i-1], dp[i-2]+nums[i])

2024-03-05 21:23:13 481

原创 ●139.单词拆分 ● 关于多重背包,你该了解这些! ●背包问题总结篇!

然后对于每个字符串strj的检查,如果这个单词中有某个位置k为true(代表0到k这个位置可以拆分)且从k+1到这个单词的结束位置j的子串(strj字符串剩下的子串)在wordDict里面,就说明这个字符串strj从0到j都能拆分,所以dp[j]更新为true,检查这个位置k就得从字符串strj的开始到结尾了,取不取j都可以,这就是。注意,在随想录中说:多重背包在面试中基本不会出现,力扣上也没有对应的题目,大家对多重背包的掌握程度知道它是一种01背包,并能在01背包的基础上写出对应代码就可以了。

2024-03-03 22:24:06 338

原创 ● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

所以不存放硬币i的时候,凑成现在背包里面金额为j-coins[i]的最少硬币数是dp[j-coins[i]]。因为是求最少硬币数,所以应该比较dp[j](是前j-1轮的最少硬币数)和放入硬币i之后的最少硬币数dp[j-coins[i]]+1,的最小值。另外,在min中,dp[j-coins[i]]+1如果dp[j-coins[i]]是INT_MAX,再加1会超出范围,所以要在前面加个条件,等于初始值的话就说明不能组成j-coin[i],跳过。dp[j]:凑成金额j最少需要dp[j]个硬币。

2024-03-02 16:57:18 409

原创 ● 完全背包● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ

01背包逆序是为了不重复放入某个物品,因为dp[j]依靠物品 i 这一行左边的值得来,从左往右顺序来的话左边某个值放入了这一行代表的物品i,dp[j]取的是上面递推公式的右边的值,那就会再加一次value[i],也就是又放入一次物品 i。我们回忆为什么01背包只能先物品再背包,首先01背包只能逆序遍历背包(下图顺序④),然后只能先物品再背包,所以采用的顺序只能是顺序④,再顺序①,如果先①再④,在第一轮外层循环(最后一列)就确定了dp[2][4],这样肯定是不对的。另外,纯完全背包先物品或者先背包是。

2024-02-29 16:25:29 350

原创 力扣● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

dp[j]背包现在容量是j,考虑最后放入的物品,有可能是小于等于j的物品中的任意一个,那么对于所有的nums[i]≤j,都可能是最后一步放入的。所以统计dp[j]就得考虑所有的小于j的nums[i]在背包里面的情况,那么就需要把所有的dp[j-nums[i]]加起来,才是dp[j]的值。dp[0] 需要= 1,虽然=1不好解释,但是如果初始化为0的话,之后怎么加结果都只会是0,所以肯定是不行的。代码如下,注意最后返回的是另一堆的重量减去背包里的重量,因为背包重量≤sum/2,所以另一堆重量≥背包重量。

2024-02-27 16:51:55 1010

原创 卡玛网● 46. 携带研究材料 ● 01背包问题,你该了解这些! 滚动数组 力扣● 416. 分割等和子集

物品 i 放进去,背包最大重量为 j ,还没有放进去物品 i 的时候,背包的最大重量为 j - weight[i] ,数量为i-1,所以这时背包的最大价值为 dp[ i-1 ][ j - weight[i] ]。如果物品i放进重量为j的背包会超重,那么不能把i放进去,所以重量设定为j的话,从[0,i-1]选择和从[0,i]选择的最大价值是一样,所以 dp[i][j] = dp[i-1][j]。我们可以根据两种方式得到dp[i][j],两种方式对应两种情况,其实dp[i][j]就是取这两种情况的最大值。

2024-02-26 21:02:16 887

原创 力扣● 343. 整数拆分 ● 96.不同的二叉搜索树

想不到,要勇于看题解。关键在于理解递推公式。1、DP数组及其下标的含义:dp[i]是分解i这个数得到的最大的乘积。2、DP数组如何初始化:dp[0]和dp[1]都没意义,所以直接不赋值,初始化dp[2]=1即可。3、递推公式:根据题目:给定一个正整数n,将其拆分为k个的和(k >= 2可以分成两种情况:①n拆分成2个正整数的和。②n拆分成大于2个正整数的和。①的话,dp[n]应该=j*(n-j)的最大值,②的话,dp[n]应该等于j*dp[n-j]的最大值。

2024-02-25 22:02:30 1085

原创 力扣● 62.不同路径 ● 63. 不同路径 II

坐标大于第一行第一列的这些位置,因为机器人只能向下/向右走,所以只能从上个位置向下走和从左边位置向右走,那么应该是上个位置和左边位置路径条数的总和。初始化:如果第一列/第一行里面有障碍物,那么第一列/第一行之后的应该初始化为0,因为过去不了,而障碍物之前的还是初始化为1。如果有障碍物,也应该更新为0。1、DP数组及其下标的含义:dp[i][j]是起点到坐标(i,j)的路径条数。3、递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1]。,所以i是1到m-1,j是1到n-1。

2024-02-05 13:08:29 773

原创 DP第一天:力扣● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

递推公式:递推公式是要从之前的dp序列得到dp[i],所以我们要立足下标i,根据题目意思,要想到达i,有两种选择:上一节台阶跨一步,上上一节台阶跨两步。取决于两种情况哪一种花费更低,所以用min:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])。dp[1]=1)、递推公式(dp[i]=dp[i-1]+dp[i-2])、遍历顺序(一层for循环,是从小到大递推所以从小到大遍历)、打印DP数组(设置n为一个不太大的数打印序列来检查正确性)这些都是直接能知道的。

2024-02-04 23:02:03 535

原创 力扣● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间 ●738. 单调递增的数字

跟弓箭题一样的原理:先集体对左边界排序,然后从第1个区间开始,当下一个区间的左边界比该区间的右边界要小的时候,就得去掉这个区间(count++),然后应该①直接更新该区间的右边界为和他重叠的所有区间的最小右边界(取这个和上一个的较小值,会使得更新的右边界越来越小,直到最小)。或者②维护一个right代表这个最小右边界,每一次统计之后更新这个right。最主要的:每个节点的最远出现位置都要先求出来,挨个统计。此时前面出现过所有字母,最远也就到这个边界了。在遍历的过程中相当于是要找每一个字母的边界,

2024-01-17 23:51:04 478

原创 力扣● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

序列里面的每个人的前面所有人都比自己高——说明最后的结果身高是从大到小的,先排hi再排ki会把身高又打乱,所以先排ki再排hi,排ki是从小到大排,所以确定顺序——先从小到大排ki,再从大到小排身高hi,可以模拟证实一下。我就1、2分两个sort来写的,但是会报错DEADLYSIGNAL,解决办法之一是这两个sort用一个sort就能实现:当hi相同的时候,ki是从小到大的顺序,然后hi是从大到小的顺序。,这样的话从左到右,每个元素直接插入到位置是ki的地方,就能保证前ki个都是比自己高的了。

2024-01-14 22:59:06 505

原创 ● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

能知道是先把负值取反,k还没完就而且剩下的是奇数个直接把最后一个取反然后返回,剩下偶数个求和返回。有个注意的地方:在C++中为排序算法定义比较函数时,它必须是一个。● 1005.K次取反后最大化的数组和。● 135. 分发糖果。(不属于任何类的)或。● 134. 加油站。

2024-01-11 22:39:57 399

原创 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

如果今天买明天卖赚了(prices[i+1]-price[i]>0),那就第二天卖掉(maxPro+=prices[i+1]-price[i]);自己想的:从第一个元素开始,在自己后面连续的序列里面选中最接近自己的极大值,然后在这个极大值这卖掉,然后从极大值的下一个再开始,这么直到size()-1.出售”,同一天可以同时买卖,所以prices[i]可以加了之后再减!没有注意到这个条件,很重要:“你也可以先购买,然后在。● 122.买卖股票的最佳时机II。● 45.跳跃游戏II。● 55. 跳跃游戏。

2024-01-10 14:15:37 424

原创 力扣● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

遍历小孩胃口,对每个小孩,选择符合他胃口的最小尺寸的饼干。这里如果g不排序,index每轮都要从0开始,时间复杂度会到平方。● 376. 摆动序列。● 455.分发饼干。峰值是摆动的不能删。

2024-01-08 23:35:16 351

原创 力扣* 491.递增子序列* 46.全排列* 47.全排列 II

代码随想录的解决办法是一个循环里面用一个unordered_set(用set也可以,用set比unordered_set时间还短一些),每次处理一个节点,就把这个节点放到unordered_set里面去。注意这个unordered_set放这一层的节点,元素从左往右处理所以从左往右进入这个unordered_set,是不参与回溯的,unordered_set只有insert的操作。用continue是剪枝,当前节点的所有子孙(下面的)不会处理,就此cut,但是同层右边的节点还是会处理。

2024-01-05 14:45:33 362

原创 力扣●93.复原IP地址 ●78.子集 ●90.子集II

而且我这个用了path单独放子串,然后回溯用substr删除递归前面加上的子串,时间空间复杂度有点高。这道题跟回文子串切割差不多的结构,但是剪枝有好几个地方。

2024-01-04 13:45:00 441

原创 力扣● 39. 组合总和● 40.组合总和II● 131.分割回文串

先看for循环次数,每一个节点下的都不一样,所以设for循环的次数范围为:[index,cadidates.size()-1],index是父节点的下标值,也就是下一层可以选择从父节点这个元素开始到结尾元素。所以树枝上是不会有重复元素的,我们需要关注的是。代码随想录提出的方法就是使用一个bool型的used数组,处理一个节点就修改一下used数组的值,所以回溯的时候也要操作used数组。比如这里第三层used是[1,1,0],那么目前为止已经取了1,1,也就是到根节点路径上的所有元素是1、1。

2024-01-02 19:19:04 987

原创 力扣● 216.组合总和III● 17.电话号码的字母组合

例如,在这里,如果组合中数字的和已经超过了目标数n,或者组合中的数字数量超过了k,这时应立即停止进一步的递归调用,因为这条路径不能导致有效解。在这里,当组合中的数字数量恰好为k,并且它们的和等于n时,您找到了一个有效的解决方案,应将其添加到结果集中,并停止进一步的递归调用。注意:1、跟77不是完全一样,我们需要统计和,所以设置sum变量,处理节点的操作包括2步:(1)、节点入vector;和77.组合一样的,树的结构都是2层,横向是9个分支,如下图,所以递归次数(即for循环)是9次。

2023-12-31 23:46:54 424

原创 回溯day1

把这个结构一般化成一个两层的树,第二层的节点应该是n个(以n开头有n-1个,以n-1开头有n-2个,……这个题因为直接就是二叉树,不需要我们把问题翻译成m叉树的方式,且书中节点孩子数是2(左右孩子),因此递归了2次。写函数backtracking,n和k都得写进去,循环里的意思就是,先处理以n开头的k个组合,然后递归处理以n-1开头的k个组合。所以for的次数是n,递归次数就1个,所以for循环体里面就一个递归函数。我们套用这个模板之前,要先把问题解释为m叉树,可以参照随想录的这个例子:。

2023-12-25 20:15:32 419

原创 669. 修剪二叉搜索树 & 108. 将有序数组转换为二叉搜索树 & 538. 把二叉搜索树转换为累加树

而且root->val小于low的时候,root的整个左子树肯定小于low,但是右子树得修剪,右子树如果为空会直接返回Nullptr,所以不用分情况写。如上,先把左右子树都修剪了,再来看root->val的范围,如果小于low直接删除左子树返回右孩子(把左子树删除了,自己由右孩子代替),如果大于high直接删除右子树返回左孩子。错误,因为如果root的值在范围外的时候,不能直接返回root->left或者root->right,这样root的整个左子树或者右子树都没有被处理。108.看起来简单还是犯错了。

2023-12-24 20:00:13 354

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除