自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营30期——总结篇

卡哥题目编排顺序设置的很好,刚开始刷题的时候正反馈拉满,就觉得自己怎么这么nb啊这都给我做出来了(然后被贪心和动规暴打),有段时间甚至做题手痒一天刷了四五道把第二天的题都刷掉了。我自认为自己的自制力不算差(应该能超过六七成的人吧),但我确实不敢说我能一个人在60天内从0开始完成这么多的算法题,甚至寒假还在刷,甚至刷完还都写了博客。

2024-03-17 12:07:18 681

原创 代码随想录算法训练营Day60 | 84.柱状图中最大的矩形

寻找以heights[i]为高的最大矩形面积:找到左右两边第一个比自身矮的柱子作为界限,以该区间长度作为宽,heights[i]作为高得到矩形面积。这题其实和 42.接雨水有点相似,接雨水是寻找左右第一个比自身大的作为“墙壁”,这题是寻找左右第一个比自身小的作为“界限”训练营的最后一题啦,完结撒花!从栈顶到栈底递减的单调栈。

2024-03-15 16:36:56 406

原创 代码随想录算法训练营Day59 | 503.下一个更大元素 II、42.接雨水

既然要找左右第一个比当前高的柱子,那么就很容易联想到单调栈。由于是找比自身大的,所以栈顶到栈底应该是递增的。知道怎么计算雨水量了,那么最朴素的思路就是只要知道每一个柱子左右边最高柱子的高度各是多少就能计算出该柱子能接的雨水量了。可以使用双指针判断每一个柱子的左右最高高度,但那样对于每个i都要遍历一次数组,时间复杂度为O(n2)。,使用两个数组分别记录当前位置左边与右边最高柱子的高度,时间复杂度为O(n)= min(左边最高柱子高度, 右边最高柱子高度) - 第i根柱子高度。(每个柱子占一格宽度)

2024-03-15 16:25:55 429

原创 代码随想录算法训练营Day58 | 739.每日温度、496.下一个更大元素 I

将问题分解好这道题就不难了,两个子问题的处理都比较简单,其中单调栈的写法和上一题差不多。一般存放的是元素的下标,如果需要使用值可以通过下标获取。单调栈的作用:使用栈来记录已经遍历过的元素。什么时候使用单调栈:通常是一维数组,2、单调栈里的元素是递增还是递减的?本题求的是每个元素左边的第一个比自身。,此时我们就要想到可以用单调栈了。1、单调栈中存放的元素是什么?

2024-03-13 21:07:12 445

原创 代码随想录算法训练营Day57 | 647. 回文子串、516. 最长回文子序列

s[j] 时:不取s[i]、不取s[j]、s[i]与s[j]都不取,三种情况中取最大(前两种情况包含了第三种情况,所以实际只有两种)情况3:j - i > 1,是否是回文串依赖[i + 1, j - 1]子串是否是回文串。: dp[i][j] 为bool,表示区间 [i, j] 内的最长回文子序列长度。: dp[i][j] 为bool,表示区间 [i, j] 的子串是否是回文串。:i 依赖 i + 1,j 依赖 j - 1,所以从下向上、从左向右遍历。情况2:i是j前一位,是回文串。

2024-03-11 19:32:09 375

原创 代码随想录算法训练营Day55 | 583.两个字符串的删除操作、72.编辑距离

这类题目做多了还是能找到些套路的:1、DP数组定义· DP数组的定义一般是题目要求什么就定义成什么,· dp[i][j] 一般表示的是以word1[i - 1]为结尾的子串和 word2[j - 1]为结尾的子串2、DP数组初始化:结合题意,一般首行和首列的初始化最为重要3、递推公式分析状态转移可以分为“基础”和“新增”两部分:· 基础:继承之前的状态,如果当前值匹配一般只要进行这步操作· 新增:在之前状态的基础上增加操作时新增的值,如果当前值不匹配一般需要额外进行这步操作4、遍历顺序。

2024-03-10 11:36:54 831

原创 代码随想录算法训练营Day54 | 392.判断子序列、115.不同的子序列

(实际为不使用s[i - 1],也不使用t[j - 1]时的匹配数,但由于s[i - 1] == t[j - 1],所以使用后当前匹配数与其相等,所以dp[i - 1][j - 1]可以理解为使用s[i - 1]时的匹配数)· 新增——dp[i - 1][j - 1]:如果s[i - 1]是否等于t[j - 1],则加上这个。,无论s[i - 1]是否等于t[j - 1],dp[i][j] 至少都会继承这个值。:首列元素初始化为1,s的所有子串都能与空字符串匹配一次。: dp[i][j] 表示以。

2024-03-08 10:25:34 412

原创 代码随想录算法训练营Day53 | 1143.最长公共子序列、1035.不相交的线、53.最大子数组和

nums2[j - 1],dp[i][j] 取dp[i][j - 1] 和 dp[i - 1][j] 中的较大值。· 如果nums1[i - 1] == nums2[j - 1],那么dp[i][j] = dp[i - 1][j - 1] + 1(同718)1、之前的值加上nums[i]: dp[i] = nums[i] + dp[i - 1]左上方矩阵到达dp[i][j]的唯二途径就是dp[i][j - 1] 和 dp[i - 1][j]:dp[i]以nums[i]为最后一个元素的最大子数组和。

2024-03-07 22:55:01 392

原创 代码随想录算法训练营Day52 | 300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组

基本——dp[i - 1][j - 1]:以nums1[i - 2]和nums2[j - 1]为结尾的两个字符串的最长重复子数组长度。:如果nums1[i - 1] == nums2[j - 1],那么dp[i][j] = dp[i - 1][j - 1] + 1。· 最后的递推公式:dp[i]取较大值:dp[i] = std::max(dp[i], dp[j] + 1)这题的重点是DP数组的定义,子序列必须以nums[i]为最后一个元素,这样dp数组中后面的元素才能与前面的元素进行对比。

2024-03-06 23:00:20 455

原创 代码随想录算法训练营Day51 | 309.买卖股票的最佳时机含冷冻期、714.买卖股票的最佳时机含手续费

股票问题的动规解法还是有一定套路的,自己感觉做下来重点就是整理好状态分类和状态转移,前者决定DP数组的定义,后者决定递推公式状态分类状态分类的基础——持有不持有· 持有:今天或前几天完成了买入,当前手头持有股票· 不持有:今天或前几天完成了卖出,当前手头不持有股票在持有/不持有的基础上进一步结合题目分析状态分类,如:· 123.买卖股票III:持有/不持有进一步分为第一次或第二次的持有/不持有· 309.买卖股票含冷冻期:不持有进一步分为今日卖出和前几日卖出状态转移状态转移的基础——买入卖出。

2024-03-05 21:38:29 834

原创 代码随想录算法训练营Day50 | 123.买卖股票的最佳时机 III、188.买卖股票的最佳时机 IV

dp[i][j]为当前利润,买入则减,卖出则加。j 取值范围[0, 4],分别表示第一次持有,第一次不持有,第二次持有,第二次不持有。思路与 121.买卖股票I 一脉相承,一次买卖有2种状态(持有/不持有),那么两次买卖就有4种状态(第一次持有/不持有、第二次持有/不持有):dp[0][0]初始化为-prices[0],其余元素都初始化为最小值,表示还没进行该操作。· 第 j 次持有的下标为 2 * j ,第 j 次不持有的下标为 2 * j + 1。· 第 j 次不持有需要在第 j 次持有的基础上进行。

2024-03-04 20:57:03 356

原创 代码随想录算法训练营Day48 | 121.买卖股票的最佳时机、122.买卖股票的最佳时机 II

dp[0]初始化为-prices[0],起步资金为0,所以相当于第一次买入,即 dp[0] = 0 - prices[0]· dp[i][1]表示如果当前不持有股票,所能获得的最大利润(· dp[i][0]表示如果当前持有股票,所能获得的最大利润(dp[i][j]为当前利润,买入则减,卖出则加。与 I 相比,差异在于可以反复买入卖出,即每次。时的启动资金不是0,而是之前卖出所得的资金总量。持有的股票可以是当天购入的也可以是之前购入的。可以是还没有购入过也可以是购入后卖出了。:按时间顺序从前向后遍历。

2024-03-03 11:47:39 403

原创 代码随想录算法训练营Day47 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

整体递推思路还是延续前两题:dp[i] = std::max(dp[i - 1], dp[i - 2] + nums[i])· 偷第i家:最大金额等于 i - 2 家的最大金额加上当前这家的金额(i - 1家被跳过),即dp[i - 2] + nums[i]· 递推公式选择金额高的一个:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]):dp[0]初始化为nums[0],dp[1]初始化为max(nums[0], nums[1])(前两家选钱多的一家偷)。

2024-03-01 20:35:24 399

原创 代码随想录算法训练营Day46 | 139.单词拆分、多重背包(卡码网56.携带矿石资源)

一维滚动数组vector<bool>。dp[j]表示字符串s的[0, j]子串是否能够匹配。2、

2024-02-29 20:32:31 418

原创 代码随想录算法训练营Day45 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279. 完全平方数

一维滚动数组。dp[j]表示凑成金额 j 最少需要几枚硬币。2、

2024-02-28 20:48:40 332

原创 代码随想录算法训练营Day44 | 完全背包理论基础、518.零钱兑换 II、377.组合总和 Ⅳ

无论是完全背包与0-1背包的差异,还是排列问题与组合问题的差异,最好的理解方法就是动手模拟一下dp数组的更新过程,模拟实际的物品是怎么一个个放入背包的。

2024-02-27 22:11:10 412

原创 代码随想录算法训练营Day43 | 1049.最后一块石头的重量 II、494.目标和、474.一和零

对于要分为两组的问题,需要进行一定的数学推理将其变为一组,如:1049:将石头分为重量尽可能接近的两组 -> 分出一个子集,其总和尽可能接近总重量的一半494:将所有元素分为+的一组和-的一组,经过数学推理 -> 求统计总和为 (sum + target) / 2 的子集数量。

2024-02-26 22:28:02 917

原创 代码随想录算法训练营Day41 | 0-1背包理论基础、416.分割等和子集

一维数组,使用滚动数组来实现背包。方便理解使用二维数组来解释定义:dp[i][j]表示 n = i 时,数组下标[0, i]中取任意数所能得到的最大值,这个最大值不能超过j。

2024-02-25 20:00:04 460

原创 代码随想录算法训练营Day40 | 343.整数拆分、96.不同的二叉搜索树

前几天的动规题感觉主要是“状态的转移”,考虑的是当前状态如何由之前的状态变化得到,如不同路径:当前节点由其上方或左方格子向下/右走得到爬楼梯:当前楼层由其前一层或两层跳跃得到这类问题的遍历维度和题目维度一致,爬楼梯是一维的那么就遍历一维,走格子是二维的那么就遍历二维的。而今天的题感觉主要是“拆”,考虑的是当前的状态如何拆分得到之前的状态,如整数拆分:一个数可以拆分为多个数使得其乘积最大不同的二叉树搜索树:一个树可以拆分为左右两个子树这类问题除了遍历题目中的维度,还得。

2024-02-23 21:00:25 1585

原创 代码随想录算法训练营Day39 | 62.不同路径、63. 不同路径 II

有障碍时dp[i][j]设置为0(一方面表示没有方法能到达该格子,一方面表示无法从该格子出发向右或向下到达其他格子),否则dp[i][j] = dp[i - 1][j] + dp[i][j - 1]:走到一个格子即走到其上方格子再向下走一步,或走到其左方格子再向右走一步,所以:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]:二维DP数组,dp[i][j]表示到达行 i 列 j 格子的方法数。:首行与首列如果出现障碍物,其后的行/列都初始化为0,否则初始化为1。

2024-02-22 16:56:52 1225

原创 代码随想录算法训练营Day38 | 509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

爬到第i层 = 爬到 i - 1 层并再爬一层 + 爬到 i - 2 层并再爬两层,即dp[i] = dp[i - 1] + dp[i - 2]:爬到第i层 = 爬到 i - 1 层并再爬一层 + 爬到 i - 2 层并再爬两层,所以某一层的花费取从前两层爬上来花费的较小者。:题目直接给出了——dp[i] = dp[i - 1] + dp[i - 2]:从0和1出发都可以,出发层不需要消费,所以dp[0]和dp[1]都初始化为0。:按照题意dp[0] = 0, dp[1] = 1。

2024-02-21 17:16:33 404

原创 代码随想录算法训练营Day37 | 738.单调递增的数字、968.监控二叉树

这题其实在想的时候抓到了点蛛丝马迹,有想到再叶节点的父节点安置摄像机,也想到了根据子节点状态分类判断父节点,但确实整理想了半天还是乱糟糟的(主要没想到叶节点直接上推即可)· 不符合单调递增,或数字为0时,当前位置的数字进行退位(因为0前面至少有一个大于0的数字,所以0必定需要退位)2、如果两个节点都为1,则本节点可以不被覆盖(在其父节点设置摄像机),设置为0。1、如果两个节点中任一节点为0,则本节点必须安置摄像机,即设置为2。3、两个节点中有一个2(但没有0),则本节点被覆盖,设置为1。

2024-02-21 17:13:09 416

原创 代码随想录算法训练营Day36 | 435.无重叠区间、763.划分字母区间、56.合并区间

大致思路:将每个字母都抽象为一个区间,区间记录其第一次与最后一次出现的位置。如果发生重叠则更新当前区间的右边界,如果没重叠则记录结果。整体思路有点类似于之前的跳跃游戏II:不断更新当前分割下所能到达的最远右边界,当到达右边界时更新结果。这题自己的思路也是将其抽象为昨天打气球类似的框架,写出来虽然能AC但又抽象又繁琐,不是很美丽。)——当前区间左边界小于之前区间右边界时移除元素。(将所有字母抽象为区间后就和后面的56合并区间几乎完全一致了,仅有记录结果的方法不同)——移除右边界更靠后的元素。

2024-02-19 19:50:40 443

原创 代码随想录算法训练营Day34 | 860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球

对于用于对比的右边界,不应该直接对比上一个气球的右边界,而应该对比上一只箭的最大右边界(即该只箭所射爆的所有气球中右边界的最小值),超过该值说明需要一只新箭。· 由于左边界经过排序,所以当前左边界必定小于等于上一个气球的左边界,所以只需要判断与上一个气球的右边界相比是否符合条件即可。:左边界从小到大排序,左边界相同的情况下右边界从大到小排序(右边界排序规则不重要,重点在于左边界的排序)· 判断左边界是否大于上一个气球的左边界,且小于上一个气球的右边界(2次)如果未排序,对于判断是否重叠需要。

2024-02-18 17:04:25 372

原创 代码随想录算法训练营Day33 | 1005.K 次取反后最大化的数组和、134.加油站、135.分发糖果

那么就能得出:如果一个站点之前的总净加油量越小,那么该站点之后的总净加油量就越大。思路:寻找一个加油站,该加油站前所有加油站的净加油量最小,从此处出发能实现“硬骨头放在最后啃”的效果。第一步:从前往后逐个获取与左对比的结果,如果评分比左边高,则糖果量比左多1,评分低则糖果量不变。第二步:从后往前逐个获取与右对比的结果,如果评分比右边高,则糖果量比右多1,评分低则糖果量不变。本题的局部最优:一个小孩的糖果数和左边比符合条件,和右边比也符合条件。与左边比的结果和与右边比的结果,再对两边的结果进行合并。

2024-02-16 20:23:59 436

原创 代码随想录算法训练营Day32 | 122.买卖股票的最佳时机 II、55.跳跃游戏、45.跳跃游戏 II

如果一个节点能直接跳到终点,就将其作为新的终点,判断其他节点能否跳到该节点。不断将“终点”前推,如果能到达起点,说明存在起点到终点的完整路径。这个设定省去了很多麻烦,每天先无脑买入即可,如果第二天价格更高就第二天卖出,如果第二天价格更低则买入当日就卖出。(贪心难道真的是没套路的吗,做了两天完全理不清楚,甚至感觉每题都是不一样的题型)用递归做完上一题后这题一眼回溯,思路是相同的,多一步用回溯记录最小步数即可。思路与上一题的贪心有点类似,但写了半天一直出小问题,老笨比了。(真没想到啊,这也太简洁了)

2024-02-15 20:52:10 326

原创 代码随想录算法训练营Day31 | 455.分发饼干、376.摆动序列、53.最大子数组和

第一天做贪心,感觉是真的奇妙,有思路就简单到怀疑人生,脑子拐不过弯就死活想不出。再品几天看看能不能品出点啥。

2024-02-14 20:23:08 389

原创 代码随想录算法训练营Day30 | 332.重新安排行程、51.N 皇后、37.解数独

今天的三道题虽然都有些难度,但做完之后发现都是可以套模板的。思考时还是要分析回溯三部曲:· 什么时候终止?终止时如何收集结果?· 单层的递归逻辑是什么?如何判断当前的参数是否合法?如何进入下一层递归?(回溯题做到现在发现我很喜欢使用used数组来辅助判断合法性。这步就可以思考如何标记used数组。· 为了实现以上目的,我需要哪些参数?返回值类型是void即可还是使用bool来辅助剪枝?

2024-02-13 16:41:59 378

原创 代码随想录算法训练营Day29 | 491.非递减子序列、46.全排列、47.全排列 II

这题不能对原序列进行排序,想了半天最后还是用回了set来去重。其他方面与之前题型差不多,按模板写即可。由于我习惯的树层去重写法不基于used数组,所以这题其实就是46全排列后面加上两行树层去重的代码。明白了排列问题的特点,问题就变为如何知道哪些元素已经被使用过了。其解法也比较容易想到了:使用。判断子序列是否递增只需要将当前元素与path尾元素对比即可。,而是每次都从第一个元素开始选取。如果树层去重也基于used数组或许可以更简短一些?

2024-02-07 15:48:23 380

原创 代码随想录算法训练营Day28 | 93.复原IP地址、78.子集、90.子集II

1、分割回文串时剪枝后是continue(当前子串不是回文串但右边界右移后还有可能是回文串,所以只剪当前i),本题剪枝后是break(当前子串不是IP整数,右边界不管怎么移动之后的子串都不可能是IP整数,所以剪掉整个startIndex)这题还有个比较巧妙的地方:i < nums.size()既是循环终止条件,也是递归终止条件(相当于startIndex == nums.size()时终止递归)子集问题也可以理解为组合问题:组合问题完成整个数组的组合后才收集结果,78子集加上树层去重,没啥新鲜的。

2024-02-06 19:48:51 416

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

2、传入下一层递归的参数是 i 而非 i + 1(本层中 i 代表的开的右区间,还未被使用过)每次递归传入的是 i 而非 i+1 (使得下一层递归仍然能使用索引i处的元素)进行去重,目的是在本层内不再对重复值进行操作(去重发生在递归后,所以。本题中树枝可以出现重复值,但不能出现完全相同的组合,所以使用到的是。进行去重,目的是使一个树枝中不出现重复值(去重发生在递归前,所以。注意本题的不变量:分割子串的区间选择。· 树枝去重(剪深度):在节点操作。· 树层去重(剪宽度):在节点操作。

2024-02-06 11:28:35 310

原创 代码随想录算法训练营Day25 | 216.组合总和III、17.电话号码的字母组合

回溯:letter[i]在该位置的所有组合已经全部收集完成,将letter[i]弹出当前组合。· 终止条件:组合中的元素个数等于digits中的元素个数,说明完成组合,将结果进行保存并返回。string path:存放当前路径下组合的字符串(相当于一个一维数组)递归:获取digits中的下一个数字进行组合(递归参数传入num+1)节点操作:当前组合(path)中添加当前值(letter[i])1、之前的组合是在一个集合中选取元素进行组合,本题是在多个集合中进行组合。获取当前数字的映射数组。

2024-02-04 17:03:04 365

原创 代码随想录算法训练营Day24 | 回溯理论基础、77.组合

回溯和递归是相辅相成的,只要有递归就有回溯(执行完一次递归就自动回溯到上一层)

2024-02-04 16:03:39 425

原创 代码随想录算法训练营Day23 | 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

(二叉树章节完结撒花!!!等周末有空了再来更新(懒)

2024-02-02 19:00:09 353

原创 代码随想录算法训练营Day22 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

如果该节点有两个子树,选择左子树的右下角节点或右子树的左下角节点代替被删除节点节点(替代的节点性质与被删除节点最接近,如左子树的右下角节点,也满足大于该左子树中的其余所有节点)。这题相比于236简单很多,由于二叉搜索树的性质,从上向下遍历,找到第一个值介于p与q之间节点即为最近公共祖先(一侧子树上的所有节点都大于/小于根节点,所以公共祖先的值一定介于p和q之间):如果该节点只有一个子树,删除节点后将该子树与被删除节点的父节点相连(使用该子树取代被删除节点)。:如果没找到需要删除的节点,不作任何修改。

2024-02-02 18:38:16 371

原创 代码随想录算法训练营Day21 | 530. 二叉搜索树的最小绝对差、501. 二叉搜索树中的众数、236. 二叉树的最近公共祖先

如果左子树中找到了目标节点,那么该节点会被冒泡传上来,没找到时传上来的是nullptr。如果右子树中找到了目标节点,那么该节点会被冒泡传上来,没找到时传上来的是nullptr。1:左右子树结果都非空,说明两个目标节点分布在两侧子树,符合情况1,该节点是最近公共祖先,返回该节点(开始向上冒泡)2、左右子树结果任一为空,说明一边子树找到了目标节点,返回非空的那一侧(找到的那个目标节点继续向上冒泡)如果右子树中找到了目标节点,结果为true。对应情况2:节点自身就是目标节点,左右结果任一为true,更新ans。

2024-02-02 11:56:00 874

原创 代码随想录算法训练营Day20 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

每次都从序列中搜索最大值,以该值为界分割序列进行递归即可。· 返回值类型:TreeNode*,返回当前子树的节点指针· 传入参数:vector nums:用于构建当前子树的序列数组· 终止条件:序列为空,返回nullptr表示当前子树为空· 单层递归逻辑——前序遍历:中:从序列中搜索最大值,构造根节点指针左:递归构造左子树,传入最大值左侧的序列右:递归构造右子树,传入最大值右侧的序列将传入参数变为代表左右区间的迭代器,从原始数组中切片,这样就不需要每次都创建左右子树的序列数组了。

2024-01-29 23:12:01 984

原创 代码随想录算法训练营Day18 | 513. 找树左下角的值、112.路径总和、106.从中序与后序遍历序列构造二叉树

中序序列分割:以中间节点为界进行分割,前面的是左子树的中序序列,后面的是右子树的中序序列· 后序序列分割:后序序列分割后的长度与中序序列分割后的长度统一,根据长度依次分割出左右子树的后序序列注意需要先分割中序再分割后序,因为分割后序序列需要中序序列的长度信息需要先获取当前节点才能分割出左右子树,所以使用前序遍历:递归——前序遍历思路:将当前序列不断分割出当前节点、左子树序列、右子树序列,递归地构造二叉树· 返回值类型:TreeNode*,返回当前节点所代表子树的指针· 传入参数:

2024-01-28 11:20:13 1858 1

原创 代码随想录算法训练营Day17 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

思路的重点是判断完一个子树是否是平衡二叉树时如何返回结果。开始想的是把递归的返回值类型设置为bool,但是这样就无法返回子节点的高度信息,最后还是没想明白。思路:不断获取子节点的高度,如果两侧节点高度差大于1,说明该节点代表的子树是非平衡二叉树,返回-1即可。最后递归的结果如果是-1,说明是非平衡二叉树。

2024-01-27 18:24:02 895

原创 代码随想录算法训练营Day16 | 104.二叉树的最大深度、559.N叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

层序遍历的判断条件比较简单,存在两个孩子与只存在某一个节点的逻辑可以写在一起。层序遍历打十个之一。· 单层逻辑:分别计算当层节点左右子树的节点数,再算上自己1个节点进行返回。· 单层逻辑:分别计算当层节点左右子树的节点数,再算上自己1个节点进行返回。· 单层逻辑:计算左右子树的深度,取较大值即可。· 终止条件:遇到空节点返回节点个数0。· 返回值:使用int型返回节点个数。· 返回值:使用int型返回节点个数。· 传入参数:传入一个节点指针。· 传入参数:传入一个节点指针。· 传入参数:传入一个节点指针。

2024-01-25 22:34:06 350

空空如也

空空如也

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

TA关注的人

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