- 博客(52)
- 收藏
- 关注
原创 代码随想录算法训练营 day60 | 84.柱状图中最大的矩形
注意:考虑到数组本身是降序or升序这两种特殊情况,需要对原始数组进行扩容,首位都加上一个0元素,来保证结果的正确性。对每一列往左右两边找到更小的那一列,结束,然后计算当前的最大面积。即为当前列的高度*左右两边更小的列的宽度(不包括左右两列)一旦遇到更小的就弹出凸的部分,记录此时的面积。与接雨水相反,用凸的那一部分记录最大的面积。使用从栈头到栈底递减的单调栈,单调栈中记录的始终是数组下标。
2023-07-22 13:30:55
264
原创 代码随想录算法训练营 day59 | 503.下一个更大元素II、42. 接雨水
因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。宽度的计算方式是凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度),代码为:int w = i - st.top() - 1;遇到相同的元素,更新栈内下标,就是将栈里元素(旧下标)弹出,将新元素(新下标)加入栈中。因为我们要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度。是按照行的方向计算雨水,计算所有宽度的累加。
2023-07-21 19:40:11
379
原创 代码随想录算法训练营 day58 | 739. 每日温度、496.下一个更大元素 I
但nums2的元素在nums1中出现过的时候,把该索引的位置的元素设置为当前出栈的nums2的元素,即为nums1在nums2中的下一个更大的元素。因为题目强调元素不重复,可以对nums1的元素用map记录,key为元素值,value为索引值,方便用nums2的元素查找1中的索引位置。思路:从栈头到栈底(每次从栈头压入)升序的单调栈,一旦遇到更大的就先弹出再压入,否则直接压入。也就是每次必然会压入的。对nums2的元素来进行单调栈的操作,即记录nums2的下标。
2023-07-21 19:37:14
345
原创 代码随想录算法训练营 day57 | 647. 回文子串、516.最长回文子序列
情况3是i-j绝对值大于1那么,如果dp[i+1][j-1]是回文子串,那么dp[i][j]=true。情况1和2是i=j,i-j绝对值小于等于1,那么必然是回文子串dp[i][j]=true。回文子序列和上一道题回文子串的区别在于,回文子串是连续的字符串,而回文子序列是非连续的。dp[i][j]表示区间i-j的字符串是否为回文子串 true or false。定义dp[i][j]表示i-j区间内回文子序列的最大长度。分情况分别加入i、j来看看哪个最大。初始化:dp[i][i] = 1。
2023-07-21 16:36:48
237
原创 代码随想录算法训练营 day56 | 583. 两个字符串的删除操作、72. 编辑距离
思路:跟最长公共子序列的意思是一样的,删除的步数=两个字符串总长度-2*最长的子序列长度。dp[i][j]表示字符串A从0-i-1和字符串B从0-j-1的最长公共子序列的长度。无操作 dp[i][j] = dp[i-1][j-1]删 dp[i-1][j]+1,dp[i][j-1]+1。换 dp[i-1][j-1]+1。
2023-07-18 22:53:01
374
原创 代码随想录算法训练营 day55 | 392.判断子序列、115.不同的子序列
如果第i-1和j-1元素相等,那么就有两种可能,考虑i-1的元素和不考虑i-1的元素含有的到第j-1的子序列个数。dp[i][j]表示字符串A从0-i-1与字符串B 从0-j的最长公共子序列的长度。思路:利用最长公共子序列,只有当最长公共子序列的长度等于s的长度,那么返回true。否则dp[i][j]=max(dp[i][j-1],dp[i-1][j])dp[i][j]表示字符串A从0-i-1中含有的字符串B从0-j-1的个数。
2023-07-18 22:49:29
116
原创 代码随想录算法训练营 day53 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和 动态规划
dp[i][j]表示字符串A从0-i-1与字符串B 从0-j的最长公共子序列的长度。dp[i][j]表示数组A从0-i-1与数组B 从0-j-1的最长公共子序列。否则dp[i][j]=max(dp[i][j-1],dp[i-1][j])定义dp[i]表示从0-i-1元素的最大和连续数组。要不就是前面加起来最大,要不就是只取当前值最大。思路:贪心或动态规划 ,之前用的是贪心的思路。思路:这一题跟最长上升子序列有关。思路:本质上是最长公共子序列。初始化dp[0]=0。
2023-07-18 22:46:04
215
原创 代码随想录算法训练营 day52 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
定义dp[i][j]表示数组A从0-i以及数组B从0-j的最长重复子数组的长度。dp[i]表示0-i长度的数组中的最长连续递增子序列长度。dp[i]表示从0-i的数组的最长严格递增子序列的长度。当nums[i-1]=nums[j-1]的时候。递推公式dp[i] = dp[i-1]+1;需要取dp[j-1]的最大值。实际上就是最长重复连续子序列。初始化dp[0][0]=0。
2023-07-18 22:42:42
550
原创 代码随想录算法训练营 day51 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
状态0从两种情况取最大:前一天就是买入,或者在卖出or冷冻的基础上买入dp[i][0]=max(dp[i-1][0],max(dp[i-1][3]-prices[i], dp[i-1][1]-prices[i]))0-买入状态,前一天就是买入,或者在卖出or冷冻的基础上买入。1-不持有股票状态,两种情况取最大:前一天就不持有,当天卖出。0-持有股票状态,两种情况取最大:前一天就持有,当天买入。1-不持有股票状态,前一天就不持有or前一天是冷冻期。dp[i][j]表示第i天在第j个状态的最大利润。
2023-07-13 12:54:54
207
原创 代码随想录算法训练营 day50 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
dp[len][4]是最大的结果,因为如果是dp[len][2]可以当天买入再卖出。分别是如果持有股票,那么从本来就持有和当天买入取最大。如果不持有,那么从本来就不持有和当天卖出取最大。dp[i][j]表示第i天状态j的时候最大收益。1有两种可能,之前就持有股票,当天买入股票。2有两种可能,之前就不持有,当天卖出。dp[0][0]=0第0天没有操作,3有两种可能,之前就持有,当天买入。4有两种,之前就不持有,当天卖出。状态2k-1表示第k次买入。状态2k表示第k次卖出。状态2表示第1次卖出。
2023-07-12 16:51:23
552
原创 代码随想录算法训练营 day49 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II
第i天卖出(只有在已经持有股票的情况下才会卖出。即dp[i-1][0]<0)dp[i][1]表示第i天的不持有股票所得现金。dp[i][1]表示第i天的不持有股票所得现金。dp[i][0]表示第i天的持有股票所得现金。dp[i][0]表示第i天的持有股票所得现金。思路:之前用贪心算法做过这道题。不持有股票情况:取最大。持有股票情况:取最大。第i-1天就持有股票。第i-1天就持有股票。
2023-07-11 13:53:53
183
原创 代码随想录算法训练营 day48 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III
初始化dp[0]=nums[0] dp[1]=max(nums[0],nums[1])初始化dp[0]=nums[0] dp[1]=max(nums[0],nums[1])考虑不偷第一个 和 不偷最后一个的这两种情况,取最大值。dp[j]表示第j层的最大盗取金额。dp[j]代表0-j个房屋最多能偷的金额数。dp[j]代表0-j个房屋最多能偷的金额数。考虑偷和不偷两种情况取最大。思路:和前一条道题类似。
2023-07-10 14:34:56
281
原创 代码随想录算法训练营 day46 | 139.单词拆分
定义dp[j]是长度为j的单词,是否能由当前字典词汇组成,如果是true,表示可以。如果dp[j]是true,且j-i区间的字符串出现在字典中,那么就返回true。完全背包问题、且是排列问题,因为字符串的排列顺序是有关系的。可以用回溯法:分割单词,看分割的结果是否在字典里出现过。先遍历背包,再遍历物品,且遍历背包的时候从小到大。
2023-07-08 19:14:55
326
原创 代码随想录算法训练营 day45 | 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数
另外有一个细节是只有当dp[j-coins[i]]!本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。本题目基本和上一题类似,是完全背包问题,且跟背包和物品的遍历顺序无关。dp[j]表示数字为j的时候,和为j的完全平方数的最小数量。而1、2和2、1是两种不同的结果,所以是一个排列问题。定义dp[j]表示总金额为j时候所需最少的硬币个数。定义dp[i]表示总共i阶楼梯的时候有几种方式。完全背包问题:所以遍历背包的时候从小到大遍历。递推公式:dp[i]+=dp[i-j]
2023-07-07 19:41:07
141
原创 代码随想录算法训练营 day44 | 完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ
初始化需要是dp[0]=1,表示金额为0的时候只有1中组合,就是什么也不装。用一维动态数组,遍历背包的时候需要从小到大遍历,这样就能重复使用物品了。而且既可以先遍历背包再遍历物品,也可以先遍历物品在遍历背包。完全背包和01背包唯一不同的地方:每种物品有无限件。dp[j]表示金额为j时候有多少种组合数。定义dp[j]为目标为j时候的排列个数。第i件物品的重量为weight[i]N件物品和最多能背重量为W的背包,先遍历物品在遍历背包是求组合。先遍历背包再遍历物品是求排列。所以先遍历背包,再遍历物品。
2023-07-06 20:18:54
161
原创 代码随想录算法训练营 day43 | 1049. 最后一块石头的重量、494. 目标和、474.一和零
题解思路:动态规划定义数组dp[j]表示背包容量为j时候的最大重量分成两堆石头,找到总容量为sum/2的背包最多能装多少,那么减去剩下一半就是最小值背包容量是 重量物品的体积是重量物品的价值是重量dp[0]=0;递推。
2023-07-06 20:13:27
255
原创 代码随想录算法训练营 day42 | 01背包问题、416. 分割等和子集
递推公式:比较当前物品i 在当前容量j下是放入背包 的价值更大 还是不放入背包的价值更大。dp[i][j]表示从0-i的物品里任意取,放进容量为j的背包,价值总和最大是多少。初始化需要初始化dp[0][j]和dp[j][0]因为每次遍历都需要左上角的信息。暴力的解法可以用回溯, 它是2^n指数级别的时间复杂度,所以需要用动态规划优化。d[i][j]表示第0-i个商品,放入容量为j的背包的最大价值。只能先遍历物品后背包,且背包容量需要倒叙遍历。物品的价值是数组内元素。物品的体积是数组内元素。
2023-07-06 20:12:55
192
原创 代码随想录算法训练营 day41 | 343. 整数拆分、96.不同的二叉搜索树
d[n]表示拆分成k个正整数的最大乘积(我感觉是对半拆分比较大),这里可能是多个数相乘的结果。j
2023-07-03 18:01:58
262
原创 代码随想录算法训练营 day39 | 62.不同路径、63. 不同路径 II
首先在初始化的时候,需要初始化第0行和第0列,一旦遇到了障碍物,后面都是0。d[0][1]=1 (应该把第0行的所有列都初始化为1,因为只能向右走)d[1][0]=1;(应该把第0列的所有行都初始化为1)在遍历的时候,遇到障碍物,这个位置就是0(没法到达)d[i][j]定义为可以到达第i行第j列的路径数。思路:总体和上一题一样,需要考虑遇到障碍物的情况,初始化d[0][0]=0;
2023-07-01 19:15:15
751
原创 代码随想录算法训练营 day38 | 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
目录509. 斐波那契数思路代码70. 爬楼梯思路代码746. 使用最小花费爬楼梯思路代码代码随想录509. 斐波那契数思路思路:按照递推公式f(n)=f(n-1)+f(n-2)写代码遍历即从小到大的数字遍历,因为n=0和n=1是已经有初始化的值的。代码class Solution { public int fib(int n) { if(n == 1|| n==0) return n; int dn=0; int dn_1 = 1;
2023-07-01 19:10:57
117
原创 代码随想录算法训练营 day37 | 738.单调递增的数字、968.监控二叉树
左右根 后续遍历,给摄像头节点做标记,有摄像头的节点标记为1,摄像头周围节点标记为2,没有被摄像头覆盖标记为0,从下向上,叶子结点的父节点放一个摄像头,隔两个节点放一个摄像头,直到根节点。局部最优:从最右边的位向左边遍历位数,如果左边大于右边,那么右边变成9,左边=左边-1.最终通过Integer.parseInt 和String.valueOf转换数字和字符。需要将空节点的状态设置为有覆盖,这样就能在叶子结点的父节点放摄像头。这样就能达成全局最优,得到数字n的数字。
2023-06-29 19:50:59
179
原创 代码随想录算法训练营 day36 | 435. 无重叠区间、763.划分字母区间、56. 合并区间
每次取当前的最小值(上一次最小的右边界和当前右边界)和当前的左边界比较是否重叠,如果重叠了,说明这三个1、2、3都是重叠的。其实,这一题跟前一题很像,前一题得到的是最小的箭的数量,其实道理是一样的,通过排序找到最小的箭的数量,即得到了非交叉区间的数量,此时用区间总数减去非交叉区间数量即得到了需要删除的区间数量。当遇到当前左边界大于右边界了,再把上一次的结果添加到list,否则,就合并这两个区间,合并的规则是扩展到两个区间的左右最大值。思路:按照左边界先排序,准备好一个返回的list用于保存结果。
2023-06-28 23:36:12
70
原创 代码随想录算法训练营补打卡 day35 | 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球
思路:用一个变量记录当前纸币5的数量以及10的数量,在找零20的时候,优先选择5和10 的组合,因为5能够找零的场景更多。题解思路:先按照x坐标的最左边位置排序, 当前一个的最右坐标大于后一个的最左坐标,表示此时需要多一个箭。因为k统计的是 前面大于等于他的数量,所以需要按照h从大到小排, 如果相等再按照k从小到大排。思路:找到身高最矮的人,然后找到他前面有多少人是等于或高于他,就可以确定他在第几个位置。题解思路:有两个维度,h和k 需要先确定一个维度,再按照另一个维度重新排列。以及toArray方法。
2023-06-27 20:46:07
221
原创 代码随想录算法训练营 day34| 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果
排序,然后从前往后取反,在小于等于0的最小位置不停取反,如果都大于0,那么就对第一个数不停取反。如果跳出循环后k还大于0,那么需要把结果减去2倍的nums[0],因为之前多加了一次!题解思路: 两次贪心,一次从左到右(最左边初始化为1),一次从右到左,考虑比前一个孩子评分较大的情况。然后在两个中取最大值!2、每次记录当前段的剩余油量,一旦小于0,就清0,把结果变为从下一个节点作为起点,这样就能“填平”前面的负数。思路:从最少的那个数开始往两边按照规则分发,给最少的1个糖果,评分更高的多1个。
2023-06-27 20:42:20
55
原创 代码随想录算法训练营补打卡 day32 |122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
题解思路:关键在于记录每次的最大覆盖范围,只要从起点开始的最大覆盖范围达到终点那么就是可以达到终点的.关键在于扩展遍历的终点大小cover!意义在于,如果这一步的最大覆盖范围还没有达到终点,那么就再向前走一步。只要这一步可以覆盖了,那么就是最小跳跃数。题解思路:以最小的步数增加覆盖范围!从而获得达到终点的最小跳跃数。注意这个步数不是每一步都要++,而是每次更新最大覆盖范围需要++题解思路:局部最优是收集每天的正利润,全局最优是求最大利润。思路:把所有的正差值加起来。
2023-06-25 13:43:51
151
原创 代码随想录算法训练营补打卡 day31|455.分发饼干、376. 摆动序列、53. 最大子序和
贪心算法每一阶段局部最优,从而达到总体最优。贪心没有套路,通过常识性推导加上举反例得到。
2023-06-25 13:41:15
154
原创 代码随想录算法训练营补打卡 day30| 332.重新安排行程、51. N皇后、37. 解数独
string的conpareTo方法是重写好的。注意一定要升序,然后给回溯函数一个返回值,这样一旦找到了第一个返回值就返回,不用遍历整个回溯过程!题解思路:二维递归,因为它需要每个位置都遍历过去,所以需要对行和列都做一个递归。棋盘的宽度即为遍历的次数,深度即为递归的次数,终值条件就是到达最后一行。首先给数组排好序,按照升序,然后一旦找到返回即可!当得到一个正确的解就返回,否则返回false。题解思路:用char数组来保存棋盘。每次判断是否满足不会攻击的条件。
2023-06-25 13:40:10
196
原创 代码随想录算法训练营补打卡 day29| 491.递增子序列、46.全排列、47.全排列 II
题解思路:其他跟前一道题类似, 关键是要记录某个变量同一树枝是否使用过,所以需要在递归的过程中,设置一个可以传递的局部变量,记录某个数字否使用过。另外在同一层需要排除已经用过的重复的数字,所以需要预先排序。全排列不需要startIndex,另外注意set的remove方法用法,它是删除掉指定元素。题解思路:重要的点在于,因为本身不是有序的,所以同层的去重中,需要去除跟之前相同的数字。这题的去重比较有意思。
2023-06-25 13:35:33
165
原创 代码随想录算法训练营补打卡 day28|93.复原IP地址、78.子集、90.子集II
设置一个最终结果集,设置一个临时结果集(用list存每次的截断串和分隔符。),最后转成string格式。终止条件是.的个数到达3个。回溯法即可,一次结果保存子集。不用遍历到最后再保存,因为需要所有的子集,所以每次递归函数都要保存一个子集。基本思路跟第一个子集问题一样,先排序,主要是除了第一次见的某个数字以外,跳过和前一个数字一样的。通过回溯,分割字符串,用一个函数判断每个分割的子串是否在0-255之间,且开头不能是0.
2023-06-25 13:32:52
202
原创 代码随想录算法训练营补打卡 day27 |9. 组合总和 、40.组合总和II、131.分割回文串
这个问题就是上一个问题,每次遍历是上一次起始位置+1即可。另外由于元素中存在重复元素,所以需要先对元素去重。回文问题可以好凑想为组合问题,模拟切割线。左闭右开,startIndex就是子串的起始位置,而i是终点。题解思路:因为要求可以重复,所以在回溯函数中每次遍历的起始所以就是上一次本身!判断回文:双指针,从前往后 和 从后往前一一对比,一旦有一个不是就不是。递归的终止条件,就是startIndex大于等于字符串的长度了。
2023-06-25 13:32:46
99
原创 代码随想录算法训练营补打卡 day25|216.组合总和III、17.电话号码的字母组合
用一个变量保存最终结果,一个变量保存一次递归的结果。当和为n和计数为k的时候,就保存这次递归的结果且返回。回溯的过程中,每次遍历当前数字的字母,然后组合在一起,当到达输入的数组长度的时候就返回遍历的结果。主要还是确定每次回溯的时候 遍历的是什么, 需要的结果是什么。建立一个从数字到字母的映射数组,用来取值。
2023-06-25 13:29:33
142
原创 代码随想录算法训练营补打卡 day24 |77. 组合
因为我复制的时候直接把result_t的引用赋值过去了,实际上需要每次new一个对象才行!否则因为一直在对引用操作,就会导致最后结果是空的。递归的过程每次向单次结果添加元素,然后回溯。每次遍历的起始位置向后移动一个指针。
2023-06-25 13:24:33
49
原创 代码随想录算法训练营补打卡 day23 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树、 总结篇
遍历的方式:深度(中左右 左中右 左右中 某些情况也可以右左反过来,具体问题具体分析)、广度(层序遍历)是否有返回值:没有返回值的话,就可以遍历整棵树,当然返回值可以使指向它的左右节点,这样也可以遍历整棵树(具体参考 把二叉树转换为累加树、将有序数组转换为二叉树等)终值条件:一般当root==null了就返回主要还是对递归的理解,深度遍历相当于是对树从上到下or从下到上进行了一次搜索。递归到底就是完成了一次任务。递归三要素:返回值、参数,终止条件,单层逻辑。
2023-06-25 13:20:31
218
原创 代码随想录算法训练营补打卡 day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。第一种情况:没找到删除的节点,遍历到空节点直接返回了。遇到大的数就往左,遇到小的数就往右。
2023-06-25 13:18:34
175
原创 代码随想录算法训练营补打卡 day21 |530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
思路:仍然按照最小绝对差的做法,设定一个pre指针,利用二叉搜索树的中序遍历是有序的特性,统计每个元素出现的个数,当某元素出现的次数更大,就计入,且删除之前记录的值,当相等,就直接加入。如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。题解思路:二叉搜索树本身是有序的树,中序遍历能够得到有序的结果。
2023-06-25 13:13:46
188
原创 代码随想录算法训练营补打卡 day20 |654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
目录654.最大二叉树思路代码617.合并二叉树思路代码700.二叉搜索树中的搜索思路代码98.验证二叉搜索树思路代码代码随想录654.最大二叉树思路题解思路:仍然使用下标对数组进行切割,每次切割都找到中间节点即可,思路更上一题的一样! 左闭右开代码class Solution { public TreeNode constructMaximumBinaryTree(int[] nums) { return constructMaximumBinaryTree1(nums
2023-06-25 13:11:02
254
原创 代码随想录算法训练营补打卡 day18|513.找树左下角的值、112. 路径总和、113.路径总和ii 、106.从中序与后序遍历序列构造二叉树
只有第一次访问最大深度的时候,记录下节点值,按照中左右的顺序,那么访问的必然是最后一行最左边节点的值。按照后序遍历的结果的最后一个数字找到中间节点,,然后切割中序遍历的 左边和右边,接着继续按照后续遍历的结果找到左边和右边的中间节点,切割中序遍历的下一个左边和右边…通过中序遍历,用一个res来保存最终的结果,只要有一个满足了根节点到叶子节点的路径和等于目标和的,那么就返回true。• 第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)利用一个map确定中序数组的下标。
2023-06-25 13:09:23
248
原创 代码随想录算法训练营补打卡 day17 |110.平衡二叉树 、257. 二叉树的所有路径 、 404.左叶子之和
注意求什么就设什么为返回变量,这里要求返回是否是平衡二叉树,也就是高度差是否大于1,那么我们只要返回高度差是否大于1即可。把path暂时存储在一个integer的list中,遇到了叶子节点,再转换成string,放到最终的结果中。代码思路:递归的函数形参设计为:是否为左节点,以及当前节点。使用后序遍历可以查高度,通过判断左右子树的高度差来决定是否是平衡的。使用后序遍历,因为,需要求叶子节点的和,所以需要先从叶子节点开始操作。通过前序遍历,获得路径的节点,终止条件是遇到叶子节点。
2023-06-25 13:03:01
119
原创 代码随想录算法训练营补打卡 day16 | 104.二叉树的最大深度、559.n叉树的最大深度 、 111.二叉树的最小深度 、222.完全二叉树的节点个数
题解思路:求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。代码思路:用后序遍历。统计左右节点的个数和,加上自身的1个。可以用后序遍历,也可以用层序遍历。用层序遍历或者 深度遍历都可以。求最大深度就是求根节点的高度。
2023-06-25 12:58:31
80
原创 代码随想录算法训练营补打卡 day15| 层序遍历、 226.翻转二叉树、 101.对称二叉树
题解思路:需要借助队列实现,这种层序遍历实际上就是图论中的广度优先遍历,应用在二叉树中。每一层会把队列中的元素弹出,遍历处理,并把下一层的元素按照顺序放入队列中。注意前序后序都可以,中序遍历不行,因为会交换两遍。判断树是否对称,即判断一棵树的内侧和外侧是否一样。当队列非空的时候,就表示遍历没有结束。实际上是左右孩子交换一下即可。逐层从左到右访问二叉树。
2023-06-25 12:55:02
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人