![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
代码随想录刷题训练营
文章平均质量分 66
菜鸟的Zoom之旅
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营第六十天| 84.柱状图中最大的矩形
假设以柱子1(指值为1的柱子)为基准,柱子1的左侧没有比柱子1矮的元素,所以柱子1可以无限像左边扩展,柱子1的右侧也没有比柱子1矮的元素,所以柱子1可以无限向右边扩展,以柱子5为基准,柱子5左侧没有比柱子5矮的柱子,说明柱子5左边不能进行扩展了,而柱子5右边第一个比柱子5小的柱子是柱子2,这说明柱子5能够扩展到柱子2(不包含柱子2)当当前元素小于栈顶元素时,比较此时栈顶元素右边元素、栈顶元素、当前元素的大小关系。所以柱子1的高度可以贯彻整个柱状图,即以柱子1为高度的面积为:1*6=6。原创 2023-07-09 20:25:08 · 88 阅读 · 0 评论 -
代码随想录算法训练营第五十九天| 503.下一个更大元素II| 42. 接雨水
当原来的栈顶元素弹出后,新的栈顶元素st.top(),就是凹槽的左边位置,下标为st.top(),卡哥的标答中指出,其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums。取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid。当前遍历的元素i,就是凹槽右边的位置,下标为i,对应的高度为height[i]。雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度),栈顶和栈顶的下一个元素以及要入栈的元素,三个元素来接水。单调栈st中储存遍历过的元素下标。原创 2023-07-08 17:28:29 · 228 阅读 · 0 评论 -
代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素 I
总体思路和上题一致,先得出nums2的result数组,再根据result推算出nums1各元素的下一个更大元素。如果需要使用对应的元素,直接T[i]就可以获取。卡哥采用了map数据结构,使代码更精简。单调栈里 存放元素的下标i,原创 2023-07-07 23:01:12 · 113 阅读 · 0 评论 -
代码随想录算法训练营第五十七天|647. 回文子串| 516.最长回文子序列
首先从递推公式中可以看出,情况三是根据dp[i + 1][j - 1]是否为true,在对dp[i][j]进行赋值true的。那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,加入s[j]的回文子序列长度为dp[i + 1][j]。加入s[i]的回文子序列长度为dp[i][j - 1]。dp[i][j]初始化为false。原创 2023-07-06 22:49:53 · 191 阅读 · 0 评论 -
代码随想录算法训练营第五十六天|583. 两个字符串的删除操作 、 72. 编辑距离
最近忙着学习新的项目 算法题有一点拉下了 唉!原创 2023-07-06 00:56:28 · 160 阅读 · 0 评论 -
代码随想录算法训练营第五十五天|392.判断子序列、115.不同的子序列
可以根据题意进行初始化,由递推公式已知,dp[i][j]由dp[i-1][j-1]和dp[i-1][j]推导而来,故dp[i,0]和dp[0,j]都需要进行初始化。dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右。故dp[i][0]为1。dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。dp[0][0] 是比较特殊的位置,因为其是dp[i][0]和dp[0][j]的交集。原创 2023-07-03 21:08:09 · 62 阅读 · 0 评论 -
代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划
直线不能相交,这就是说明在字符串A中 找到一个与字符串B相同的子序列,且这个子序列不能改变相对顺序,只要相对顺序不改变,链接相同数字的直线就不会相交。这题要求子数组的和最大,即连续子序列的和最大。原创 2023-07-02 13:14:47 · 91 阅读 · 0 评论 -
代码随想录算法训练营第五十二天|300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组
这题和上一题相比,要求序列是连续的,则递推公式改为因为本题要求连续递增子序列,所以就只要比较nums[i]与nums[i - 1],而不用去比较nums[j]与nums[i] (j是在0到i之间遍历)。所以不再需要两层遍历。原创 2023-06-30 20:38:22 · 88 阅读 · 0 评论 -
代码随想录算法训练营第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
如果第一次卖出已经是最大值了,那么我们可以在当天立刻买入再立刻卖出。所以dp[x][4]已经包含了dp[x][2]的情况。也就是说第二次卖出手里所剩的钱一定是最多的。原创 2023-06-28 18:54:32 · 79 阅读 · 0 评论 -
代码随想录算法训练营第四十九天| 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机II
第i天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格。如果第i天不持有股票即dp[i][1]的情况, 依然可以由两个状态推出来。这道题和上一题的区别在于,本题股票可以买卖多次,所以递推公式不一样。如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来。第i-1天就不持有股票,所得现金就是昨天不持有股票的所得现金。第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金。第i-1天就持有股,所得现金就是昨天持有股票的所得现金。原创 2023-06-27 22:36:39 · 76 阅读 · 0 评论 -
代码随想录算法训练营第四十七天| 198.打家劫舍、 213.打家劫舍II 、 337.打家劫舍III
如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0];所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,在遍历的过程中,如果遇到空节点的话,无论偷还是不偷都是0,所以返回。即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}一开始拿到题目的时候,先层序遍历,算出每层的总和,再套第一题的思路。原创 2023-06-26 20:34:12 · 254 阅读 · 0 评论 -
代码随想录算法训练营第四十六天| 139.单词拆分、多重背包、背包问题总结
问能否能装满背包(或者最多装多少):动态规划:416.分割等和子集(opens new window)动态规划:1049.最后一块石头的重量 II(opens new window)动态规划:494.目标和(opens new window)动态规划:518. 零钱兑换 II(opens new window)动态规划:377.组合总和Ⅳ(opens new window)动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)原创 2023-06-25 22:55:38 · 288 阅读 · 0 评论 -
代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)、 322. 零钱兑换、 279.完全平方数
求 有多少种不同的方法可以爬到楼顶,即求装满背包共有多少种方法:递推式dp[j] += dp[j-num[i]];这道题和前一题实际上是一样的思路,都是求 装满背包的最少物品,这里直接贴上我的答案。由于可以重复取硬币,所以是完全背包问题,这里无关组合或排列,所以遍历顺序都行。每次只能爬一个阶梯或两个阶梯,即物品的重量为1或2。由于爬楼梯属于排列问题,所以先遍历背包,再遍历物品。需要n阶梯才能到达楼顶,即背包的容量为n。(那道题的背包是二维的,所以有二个维度)题目要求 返回可以凑成总金额所需的。原创 2023-06-25 00:34:32 · 258 阅读 · 0 评论 -
代码随想录算法训练营第四十四天|完全背包、518. 零钱兑换 II 、377. 组合总和 Ⅳ
完全背包中,两个for循环的先后循序,都不影响计算dp[j]所需要的值(这个值就是下标j之前所对应的dp[j])第i件物品的重量是weight[i],得到的价值是value[i]。这题和上题的区别在于, 他虽然名字是组合总数,其实他也强调了元素的顺序,即排列。这题和01背包中的“目标和”很像,都问的是:装满背包一共有多少种方法?01背包内嵌的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全背包的物品是可以添加多次的,所以要从小到大去遍历。其实对于完全背包,先遍历物品或先遍历背包容量都是可以的。原创 2023-06-24 00:27:22 · 219 阅读 · 0 评论 -
代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 、494. 目标和、 474.一和零
力扣本题的实质是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。本题物品的重量为stones[i],物品的价值也为stones[i]。对应着01背包里的物品重量weight[i]和 物品价值value[i]。确定dp数组以及下标的含义dp[j]表示容量为j的背包,最多可以背最大重量为dp[j]。确定递推公式01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);dp数组初始化。原创 2023-06-22 23:54:24 · 49 阅读 · 0 评论 -
代码随想录算法训练营第四十二天| 背包问题
所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);递归公式中可以看出dp[i][j]是靠dp[i-1][j]和dp[i - 1][j - weight[i]]推导出来的。dp[i-1][j]和dp[i - 1][j - weight[i]] 都在dp[i][j]的左上角方向(包括正上方向)因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖。原创 2023-06-20 22:54:10 · 443 阅读 · 0 评论 -
代码随想录算法训练营第四十一天| 343. 整数拆分、96.不同的二叉搜索树
所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。原创 2023-06-19 22:49:27 · 186 阅读 · 0 评论 -
代码随想录算法训练营第三十九天| 62.不同路径 、63. 不同路径 II
时,有障碍物的地方及其之后的数(因为有障碍物就说明这一行障碍物之后都无法再走了)都设为0,在递推赋值的时候,碰到障碍物,则在该点设为0。但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。题外话:这题拿到的时候就发现其实是小学三年级的奥数题,甚至寒假看我妹做过【笑哭😂】这题和上一题相比,多了障碍物。原创 2023-06-17 21:45:54 · 512 阅读 · 0 评论 -
代码随想录算法训练营第三十八天| 509. 斐波那契数 、70. 爬楼梯、746. 使用最小花费爬楼梯
今天开始动态规划了~原创 2023-06-16 22:28:36 · 448 阅读 · 0 评论 -
代码随想录算法训练营第三十七天| 738.单调递增的数字
例如: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]。错误之处在于当输入为100时,按上述代码就会输出90,然而实际上应该输出99。原创 2023-06-15 22:23:41 · 37 阅读 · 0 评论 -
代码随想录算法训练营第三十六天| 435. 无重叠区间、763.划分字母区间、56. 合并区间
只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后。其中s.rfind() 用于从后向前 记录想要查找字母的位置。卡哥的代码巧妙利用了hash表来记录某一字母最远端的位置。本题其实和“用最少数量的箭引爆气球”非常像,这题感觉比较简单,可以模拟出来。该题与跳跃游戏有点类似。原创 2023-06-14 22:32:19 · 80 阅读 · 0 评论 -
代码随想录算法训练营第三十五天| 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
注意,这道题一开始我的思路就是正确的,但是一直超时,后来才发现是比较器里的vector忘记采用引用的方式了。写这道题时,也可以在脑子进行模拟进行解题,这道题的关键是后一个数组和前一个数组是否有交集,若有交集,则再比较下一个数组和这个交集是否有交集,有,则更新交集;按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。若当前数组的第一个值小于等于前一个数组的第二个值,则说明有交集,此时就可以更新交集。全局最优:完成全部账单的找零。原创 2023-06-13 23:00:40 · 115 阅读 · 0 评论 -
代码随想录算法训练营第三十四天| 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
现在你在start出发,走到了某个站点end,被end站点的坏人砍死了,说明你在 [start, end) 存的钱不够付 end点坏人的过路费,因为start站点是个好人,所以在 (start, end) 里任何一点出发,你存的钱会比现在还少,还是会被end站点的坏人砍死;好人会给你钱,坏人会收你一定的过路费,如果你带的钱不够付过路费,坏人会跳起来把你砍死;当元素全大于0的时候,则反转数组中最小的元素,k为负值的情况下,最小元素反转,k为偶数的情况下,最小元素不需处理(因为反转偶数次还是原来的元素)原创 2023-06-12 22:14:09 · 181 阅读 · 0 评论 -
代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机II 、55. 跳跃游戏 、 45.跳跃游戏II
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。如果 cover 大于等于了终点下标,直接 return true 就可以了。原创 2023-06-10 22:25:30 · 128 阅读 · 0 评论 -
代码随想录算法训练营第三十一天| 455.分发饼干、 376. 摆动序列 、53. 最大子序和
从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。然后,将小饼干分给胃口小的小孩 ,若当前饼干的尺寸不能满足小孩的胃口,则指向饼干数组的指针自加,若能满足,则指向饼干的指针和指向小孩的指针同时自加。局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。原创 2023-06-10 18:13:55 · 39 阅读 · 0 评论 -
代码随想录算法训练营第三十天| 332.重新安排行程、51. N皇后、37. 解数独
思路上大致清晰,这里文章先占个坑,等二刷的时候来填。原创 2023-06-08 22:51:54 · 109 阅读 · 0 评论 -
代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列 II
可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。当然,也可以直接通过判断Path中是否出现过当前元素,来觉得是否把当前元素放入Path。由于求子序列,一个元素不能重复使用,所以需要Index,调整下一层递归的起始位置。这题的不同在于,给定的是一个可重复包含数字的序列,所以这题在上题的基础上,也需要。used数组,标记已经选择的元素。原创 2023-06-07 22:50:11 · 150 阅读 · 0 评论 -
代码随想录算法训练营第二十八天| 93.复原IP地址、78.子集、 90.子集II
在单层遍历for循环中,注意判断当前字符是否合法(是否超过三位数,是否大于255或小于0,是否是两位数却第一位是0),不合法时,直接continue;也就是说,遍历这个树的时候,把所有节点记录下来,就是子集集合。所以要做到树层去重,这里去重的逻辑和组合中去重的逻辑是一样的,采用一个used数组来记录元素是否被访问。这一题和上一题的区别在于,nums中可能会包含重复元素,但是解集中不可以包含重复子集。这题属于模板题 ,子集也是一种组合问题,它的集合是无序的。这题和昨天的分割回文串很相似。原创 2023-06-06 21:58:30 · 37 阅读 · 0 评论 -
代码随想录算法训练营第二十七天| 39. 组合总和、 40.组合总和II、 131.分割回文串
这题和之前题目的区别在于,本题没有数量要求,可以无限重复的取某一元素,但是对元素的总和有限制,这就说明了递归的限制不在于层数,而是选取元素的总和超过target就返回。递归用来纵向遍历,for循环用来横向遍历,切割线(就是图中的红线)切割到字符串的结尾位置,说明找到了一个切割方法。这题和之前题目的区别是,这道题给出的元素中有重复元素,而解集中要求不能包含重复的组合。回看一下题目,元素在同一个组合内是可以重复的,怎么重复都没事,但两个组合不能相同。同时,本题和之前几天做过的题目相比,本题的元素可以重复选取。原创 2023-06-05 22:44:38 · 205 阅读 · 0 评论 -
代码随想录算法训练营第二十五天| 216.组合总和III、17.电话号码的字母组合
为了方便理解,我还是 套用了上一题的套路,将路径总和sum的计算放在终止条件中进行判断。这道题和昨天那道组合题的思路是一致的,代码也非常相似。本题k相当于树的深度,9(因为整个集合就是9个数)就是树的宽度。这题感觉很有意思, 一开始做的时候,没有理清楚思路,急于把输入的数字先全部变成字母了,然后后面就遇到了困难。其实呢,输入的字符长度(例如“23”)就代表着遍历的深度,而遍历的长度就是单个数字对应字符串的长度。那么for循环中的内容将改为:sum和path要跟着回溯的过程进行变化!原创 2023-06-03 21:48:03 · 99 阅读 · 0 评论 -
代码随想录算法训练营第二十四天| 回溯理论基础 、77. 组合
回溯通常隐藏在递归函数的下面,递归和回溯是相辅相成的,通常来说 回溯函数就是指递归函数。相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。每次从集合中选取元素,可选择的范围随着选择的进行而收缩,调整可选择的范围。函数里一定有两个参数,集合n里面取k个数,那么n和k是两个int型的参数。回溯法其实是一个纯暴力的搜索,有些问题只能依靠回溯法将所有的结果搜出来。子集问题:一个N个数的集合里有多少符合条件的子集。n相当于树的宽度,k相当于树的深度。树的宽度即回溯法中处理的集合的大小。原创 2023-06-02 20:11:42 · 230 阅读 · 0 评论 -
代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
错误点:例如当前点的值小于low,因为要删除节点的右子树不一定完全在指定区间内,所以不能直接 return root->right;而是要继续向右遍历,在我们的规则下,继续修剪我们要删除节点的右子树。知识点:双指针,节点pre用于保存前一个节点的值。这题和二叉树最小绝对值差 以及 二叉树的众数 使用的方法是一样的。再一开始拿到题目的时候,参考了昨天删除二叉树节点的方法,写出如下。返回要删节点的右子树在指定区间修剪完之后的新的根节点。返回要删节点的左子树在指定区间修剪完之后的新的根节点。原创 2023-06-01 21:10:31 · 35 阅读 · 0 评论 -
代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点
因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是q 和 p的公共祖先,且一定是最近公共祖先!将删除节点的左子树放在删除节点的右子树的最左侧位置下方。3、删除的节点左不空,右为空:让删除节点的父节点直接指向删除节点的左孩子。4、删除的节点左为空,右不空:让删除节点的父节点直接指向删除节点的右孩子。2、删除的节点是叶子节点(左为空,右为空):直接置空。原创 2023-05-31 22:59:42 · 150 阅读 · 0 评论 -
代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数 、 236. 二叉树的最近公共祖先
判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集,因为结果集之前的元素都失效了。后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑。原创 2023-05-30 21:39:05 · 147 阅读 · 0 评论 -
代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
先找到nums中的最大值,再根据最大值的位置将其余节点划分为左右子树,在这过程中要注意左右子树保持左闭右开区间。做这道题目 要重复利用好二叉搜索树的性质 ,二叉搜索树的节点是有序的,所以可以有方向的去搜索。在写这道题之初,我掉入了一个陷阱,即单纯的比较了左节点小于中间节点,右节点大于中间节点。二叉搜索树的特殊性就是节点的有序性,所以可以不使用辅助栈或者队列就可以写出迭代法。遍历两个树和遍历一个树逻辑是一样的,只不过传入两个树的节点,同时操作。知识点:在中序遍历下,输出的二叉搜索树节点的数值是有序序列。原创 2023-05-29 22:04:43 · 250 阅读 · 0 评论 -
代码随想录算法训练营第十八天|513.找树左下角的值、112. 路径总和 113.路径总和ii、106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
占坑。原创 2023-05-28 17:39:10 · 53 阅读 · 0 评论 -
代码随想录算法训练营第十七天|110.平衡二叉树、257. 二叉树的所有路径 、404.左叶子之和
所以只能遍历到9这个点的时候,判断其左孩子是否为空,若左孩子不为空,同时左孩子的左右孩子都为空,那么我们当前遍历的这个节点其左孩子就是我们要处理的值。和之前做过的题目有所不同的是,这道题遍历到6这个点的时候,虽然可以判断他是不是叶子节点,但是无法判断其是否是父节点的左孩子。节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。遍历顺序的选择:前序遍历,因为只有前序遍历,才能让父节点去指向其孩子节点,这样才能写出其顺序。原创 2023-05-26 22:26:15 · 36 阅读 · 0 评论 -
代码随想录算法训练营第十六天|104.二叉树的最大深度 559.n叉树的最大深度、 111.二叉树的最小深度、 222.完全二叉树的节点个数
单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)判断其子树是不是满二叉树,如果是,则利用公式计算这个满二叉树的节点数量,如果不是则继续递归。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。原创 2023-05-26 00:09:43 · 29 阅读 · 0 评论 -
代码随想录算法训练营第十五天|树的层序遍历 、226.翻转二叉树 、101.对称二叉树
解题思路:本质是比较根节点的左子树与右子树是不是相互翻转的,即我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。随后,在while循环中,判断队列当前的size,队列的size就是树在该层中的节点数量,所以有几个节点就要利用for循环分别将这几个节点的子节点再放入队列。其实还是前序遍历的逻辑,先交换左右子树节点,然后交换左子树,再交换右子树。解题思路:这道题最关键的点在于 想清楚用那种遍历方式进行遍历。一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。原创 2023-05-24 22:35:14 · 543 阅读 · 0 评论 -
代码随想录算法训练营第十四天|二叉树的遍历
这里主要掌握两种遍历方法:递归法和迭代法。原创 2023-05-23 22:51:27 · 397 阅读 · 0 评论