- 博客(53)
- 收藏
- 关注
原创 代码随想录算法训练营第六十一天|总结篇
第四:有了更多的学习途径,可以看博客,可以看卡哥的文章,还有卡哥的视频,如果遇到不懂的题目以及题解的时候,可以看看卡哥的解析或者视频,讲得都很好,很细心,很容易懂。第二:养成了写博客的习惯,以后也会坚持写博客,工作上遇到的问题或者是算法的题解,都可以使用写博客这样的记录形式,虽然不一定有人会看,但是自己也会有一定满足感。第一:对算法体系更加了解,也对自己某一模块的不足也有了一定的了解,之后也会对着些模块进行二刷甚至是多刷,以达到炉火纯青的地步。
2023-06-18 15:01:52
465
1
原创 代码随想录算法训练营第六十天|84.柱状图中最大的矩形
基本思路:那么因为本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。所以本题单调栈的顺序正好与接雨水反过来。此时大家应该可以发现其实就是。理解这一点,对单调栈就掌握的比较到位了。
2023-06-17 13:36:59
300
原创 代码随想录算法训练营第五十九天|503.下一个更大元素II|42. 接雨水
取栈顶元素,将栈顶元素弹出,这个就是凹槽的底部,也就是中间位置,下标记为mid,对应的高度为height[mid](就是图中的高度1)。如果当前遍历的元素(柱子)高度等于栈顶元素的高度,要跟更新栈顶元素,因为遇到相相同高度的柱子,需要使用最右边的柱子来计算宽度。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。
2023-06-16 14:24:44
338
原创 代码随想录算法训练营第五十八天|739. 每日温度|496.下一个更大元素 I
题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。
2023-06-15 14:41:27
435
原创 代码随想录算法训练营第五十七天|647. 回文子串|516.最长回文子序列
1,确定dp数组(dp table)以及下标的含义:本题如果我们定义,dp[i] 为 下标i结尾的字符串有 dp[i]个回文串的话,会发现很难找到递归关系。dp[i] 和 dp[i-1] ,dp[i + 1] 看上去都没啥关系。所以我们要看回文串的性质。 如图: 我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。那么此时我们是不是能找到一种递归关系,也就是判断一个子字符
2023-06-14 11:17:48
316
原创 代码随想录算法训练营第五十六天|583. 两个字符串的删除操作|72. 编辑距离
那最后当然是取最小值,所以当word1[i - 1] 与 word2[j - 1]不相同的时候,递推公式:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1});因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);同理dp[0][j] = j;
2023-06-13 16:07:39
699
原创 代码随想录算法训练营第五十五天|392.判断子序列|115.不同的子序列
t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。3,dp数组如何初始化:从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。
2023-06-12 11:27:13
739
原创 代码随想录算法训练营第五十三天|1143.最长公共子序列|1035.不相交的线|53. 最大子序和
而是dp[6]。在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。所以在递推公式的时候,可以直接选出最大的dp[i]。
2023-06-11 09:35:58
649
原创 代码随想录算法训练营第五十二天|300.最长递增子序列|674. 最长连续递增序列|718. 最长重复子数组
但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;所以dp[i][0] 和dp[0][j]初始化为0。举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。1,确定dp数组(dp table)以及下标的含义:dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。
2023-06-09 14:40:20
470
原创 代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费
如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);1,确定dp数组以及下标的含义:dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。
2023-06-08 15:20:54
321
原创 代码随想录算法训练营第五十天|123.买卖股票的最佳时机III|188.买卖股票的最佳时机IV
需要注意:dp[i][1],一定是选最大的,所以 dp[i][1] = max(dp[i-1][0] - prices[i], dp[i - 1][1]);选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])。那么dp[i][1]究竟选 dp[i-1][0] - prices[i],还是dp[i - 1][1]呢?
2023-06-07 14:52:30
407
原创 代码随想录算法训练营第四十九天|121. 买卖股票的最佳时机|122.买卖股票的最佳时机II
3,dp数组如何初始化:由递推公式 dp[i][0] = max(dp[i - 1][0], -prices[i]);和 dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);
2023-06-06 11:19:28
307
原创 代码随想录算法训练营第四十八天|198.打家劫舍|213.打家劫舍II|337.打家劫舍III
LeetCode198.打家劫舍动态规划五部曲:1,确定dp数组(dp table)以及下标的含义:dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。2,确定递推公式:决定dp[i]的因素就是第i房间偷还是不偷。如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。如果不偷第i房间,那么dp[i] = dp[i - 1
2023-06-05 15:01:55
229
原创 代码随想录算法训练营第四十六天|139.单词拆分
从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。那么dp[0]有没有意义呢?dp[0]表示如果字符串为空的话,说明出现在字典里。如果确定dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true(j < i )。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。
2023-06-04 10:23:46
357
原创 代码随想录算法训练营第四十五天|70. 爬楼梯进阶|322. 零钱兑换|279.完全平方数
本题呢,dp[i]有几种来源,dp[i - 1],dp[i - 2],dp[i - 3] 等等,即:dp[i - j]。那么递推公式为:dp[i] += dp[i - j]。
2023-06-02 15:09:01
322
原创 代码随想录算法训练营第四十四天|518. 零钱兑换 II|377. 组合总和 Ⅳ
下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]。dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。3,dp数组如何初始化:因为递推公式dp[i] += dp[i - nums[j]]的缘故,dp[0]要初始化为1,这样递归其他dp[i]的时候才会有数值基础。得到的集合是排列,说明需要考虑元素之间的顺序。
2023-06-01 15:24:48
98
原创 代码随想录算法训练营第四十三天|1049. 最后一块石头的重量II|494. 目标和|474.一和零
dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j]。可以回忆一下01背包中,dp[j]的含义,容量为j的背包,最多可以装的价值为 dp[j]。相对于 01背包,本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”。2,确定递推公式:01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
2023-05-31 17:29:02
104
原创 代码随想录算法训练营第四十二天|416. 分割等和子集
而dp[6] 就可以等于6了,放进1 和 5,那么dp[6] == 6,说明背包装满了。2,确定递推公式:01背包的递推公式为:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);3,dp数组如何初始化:在01背包,一维dp如何初始化,已经讲过,从dp[j]的定义来看,首先dp[0]一定是0。背包问题,有N件物品和一个最多能背重量为W 的背包。1,确定dp数组以及下标的含义:01背包中,dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j]。
2023-05-30 15:26:11
371
原创 代码随想录算法训练营第四十一天|343. 整数拆分|96.不同的二叉搜索树
j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1,至于 i是从3开始,这样dp[i - j]就是dp[2]正好可以通过我们初始化的数值求出来。2,确定递推公式:在上面的分析中,其实已经看出其递推关系, dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量],j相当于是头结点的元素,从1遍历到i为止。
2023-05-29 14:55:33
294
原创 代码随想录算法训练营第三十九天|62.不同路径|63. 不同路径 II
4,确定遍历顺序:这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。4,确定遍历顺序:从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。下标(0, j)的初始化情况同理。3,dp数组如何初始化:在。
2023-05-27 10:38:15
244
原创 代码随想录算法训练营第三十八天|509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯
这里我们要用一个一维dp数组来保存递归的结果 1,确定dp数组以及下标的含义:dp[i]的定义为:第i个数的斐波那契数值是dp[i] 2,确定递推公式:题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2]; 3,dp数组如何初始化:dp[0] = 0; dp[1] = 1 4,确定遍历顺序:从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i -
2023-05-26 15:22:42
75
原创 代码随想录算法训练营第三十七天|738.单调递增的数字|968.监控二叉树(Pass)
例如: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]。确定了遍历顺序之后,那么此时局部最优就可以推出全局,找不出反例,试试贪心。
2023-05-25 15:08:43
56
原创 代码随想录算法训练营第三十六天|435. 无重叠区间|763.划分字母区间|56. 合并区间
此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的。接下来就是找大于区间1结束位置的区间,是从区间4开始。
2023-05-24 18:00:38
166
原创 代码随想录算法训练营第三十五天|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]]
2023-05-23 12:04:19
66
原创 代码随想录算法训练营第三十四天|1005.K次取反后最大化的数组和|134. 加油站|135. 分发糖果
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。
2023-05-22 18:40:11
51
原创 代码随想录算法训练营第三十一天|455.分发饼干|376. 摆动序列|53. 最大子序和
针对以上情形,result初始为1(默认最右面有一个峰值),此时curDiff > 0 && preDiff <= 0,那么result++(计算了左面的峰值),最后得到的result就是2(峰值个数为2即摆动序列长度为2)。从代码角度上来讲:遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和。,也就是我们在删除的时候 要不删除左面的三个2,要不就删除右边的三个2。
2023-05-20 09:47:04
61
原创 代码随想录算法训练营第三十二天|122.买卖股票的最佳时机II|55. 跳跃游戏|45.跳跃游戏II
局部最优推出全局最优,找不出反例,试试贪心!如图:i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。如果cover大于等于了终点下标,直接return true就可以了。
2023-05-20 09:46:28
109
原创 代码随想录算法训练营第二十九天|491.递增子序列|46.全排列|47.全排列 II
程序运行的时候对unordered_set 频繁的insert,unordered_set需要做哈希映射(也就是把key通过hash function映射为唯一的哈希值)相对费时间,而且每次重新定义set,insert的时候其底层的符号表也要做相应的扩充,也是费事的。可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。
2023-05-17 15:53:38
165
原创 代码随想录算法训练营第二十八天|93.复原IP地址|78.子集|90.子集II
情况就不同了,本题明确求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。就是startIndex已经大于数组的长度了,就终止了,因为没有元素可取了。从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!然后就是递归和回溯的过程:递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符。3,单层搜索的逻辑:在。
2023-05-16 21:25:07
123
原创 代码随想录算法训练营第二十七天|39. 组合总和|40.组合总和II|131.分割回文串
在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。
2023-05-15 20:47:04
102
原创 代码随想录算法训练营第二十五天|216.组合总和III|17.电话号码的字母组合
2,确定终止条件:什么时候终止呢?如果此时path里收集到的元素和(sum) 和targetSum(就是题目描述的n)相同了,就用result收集当前的结果。2,确定终止条件:例如输入用例"23",两个数字,那么根节点往下递归两层就可以了,叶子节点就是要收集的结果集。1,确定回溯函数参数:首先需要一个字符串s来收集叶子节点的结果,然后用一个字符串数组result保存起来,这两个变量我依然定义为全局。3,确定单层遍历逻辑:首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)。
2023-05-13 21:22:02
78
原创 代码随想录算法训练营第二十四天|77.组合
在第二层for循环,从元素3开始的遍历都没有意义了。举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。3,单层搜索的过程:回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。如此我们才遍历完图中的这棵树。
2023-05-12 16:44:38
121
原创 代码随想录算法训练营第二十三天|669. 修剪二叉搜索树|108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树
3,确定单层递归的逻辑:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。1,确定递归函数返回值及其参数:删除二叉树节点,增加二叉树节点,都是用递归函数的返回值来完成,这样是比较方便的。2,确定递归终止条件:这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。
2023-05-11 17:25:32
48
原创 代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先|701.二叉搜索树中的插入操作|450.删除二叉搜索树中的节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。2,确定终止条件:终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。
2023-05-10 14:45:45
71
原创 代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差|501.二叉搜索树中的众数|236. 二叉树的最近公共祖先
基本思路:把这个树都遍历了,用map统计频率,至于用前中后序哪种遍历也不重要,因为就是要全遍历一遍,怎么个遍历法都行,层序遍历都没毛病!但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。
2023-05-09 14:48:00
44
原创 代码随想录算法训练营第二十天|654.最大二叉树|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树
2,确定终止条件:因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。(2)确定终止条件:题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。1,确定递归函数的参数和返回值:递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。基本思路:使用队列,模拟的层序遍历。
2023-05-08 16:39:32
176
原创 代码随想录算法训练营第十八天|513.找树左下角的值|112.路径总和|113.路径总和Ⅱ|106.从中序与后序遍历序列构造二叉树 |105.从前序与中序遍历序列构造二叉树
基本思路:使用两个全局变量记录当前的最下位置的左节点的值和最下层的层数,对二叉树进行递归,如果当前节点不为空,那么先递归他的左节点(左边先做判断),再递归右节点。为了节省空间,我们使用哈希表记录树中的每一个节点的父节点。基本思路:在遍历一个节点时,需要先把它的非空右子节点放入队列,然后再把它的非空左子节点放入队列,这样才能保证从右到左遍历每一层的节点。基本思路:假定从根节点到当前节点的值val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为sum - val。
2023-05-07 13:28:51
58
原创 代码随想录算法训练营第十七天|LeetCode110.平衡二叉树|LeetCode257.二叉树的所有路径|LeetCode404.左叶子之和
基本思路:使用两个队列,一个为节点队列(加入根节点),一个为路径队列(加入根节点的值),如果当前的节点为叶子节点,那么直接将当前的path加入到结果集中,如果不为叶子节点,那么将当前节点的左右孩子节点加入到节点队列中,左右孩子的值加入到路径队列中。基本思路:对二叉树进行递归,判断当前节点的左孩子是否为叶子节点,如果不是就继续递归左孩子,如果是就加到结果中。基本思路:递归当前的二叉树,一边递归一边添加路径,如果当前的节点是叶子节点,那么直接把结果加入到结果集中,如果不是叶子节点则继续递归左右孩子。
2023-05-06 19:03:30
78
原创 代码随想录算法训练营第十六天|LeetCode104.二叉树的最大深度|LeetCode111.二叉树的最小深度|LeetCode222.完全二叉树的节点个数
基本思路:于104思路基本相似,当遍历到当前的节点的左右孩子都为空的时候,就直接返回当前层数,因为队列中存放的是当前层所有的节点,当有一个节点的左右孩子为空了,说明当前层就是最小深度。基本思路:如果能分别求得左右子树的深度,那么整个二叉树的最大深度就是两个子树中的较大值+1(根节点)。基本思路:使用一个队列,于基本递归换迭代方法类似,需要一个变量来控制每一层的结尾。情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
2023-05-06 16:00:38
131
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人