自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录第六十一天|总结

其实自己也不知道要总结些什么东西,毕竟每种算法的细节卡哥也帮我们总结好了,我们其实要总结的只是如何高效地利用这些总结好的东西,我觉得自己其实每次刷题并没有完全的动脑子,因为自己接触到的题型太少,就会导致自己的思维发散不开,想不到一些算法的方法,我觉得最好的总结就是多复习,多刷题,即便刷一道题的时候已经知道了思路,也要自己多写几遍代码,代码写多了以后就会知道如何去思考一种提醒,之前学习二叉树的时候,完全不懂递归如何去做,也一直想搞懂递归每次执行的逻辑,但是现在自己刷题并不需要去完全搞懂,只需要明白单层递归和终

2023-08-30 08:20:23 222 1

原创 LCS(最长公共子序列)

滑动窗口处理,一直使用str2判断str1的其中一段,并且要判断sb和r-l的大小。

2023-08-29 20:54:53 183

原创 代码随想录第五十三天

动规五部曲:1、dp数组的含义:dp[i][j]表示以text1[i-1]和text2[j-1]结尾的最长公共子序列的长度(这里为什么是i-1和j-1前面一些题解已经解释了);5、打印dp数组:主要用于debug!3、dp数组初始化:这里其实只将dp[0]初始化为nums[0]即可,但是因为后面dp[i]的递推公式有一个和nums[i]比较的,我们改成对dp[i]进行比较,所以最开始初始化的时候直接令dp=nums即可!5、打印dp数组:主要用于debug!:和上一个题一模一样!

2023-08-26 21:34:31 283

原创 代码随想录第六十天

和接雨水类似,只是需要左右补0!

2023-08-26 21:31:14 246

原创 代码随想录第五十九天

利用单调栈来存储之前遍历的值,这个题应该是找左边第一个比当前元素大的,右边第一个比当前元素大的,两者进行比较,找最小值,求得的最小值减中间元素的高度就是雨水的高,然后我们利用单调栈存储的下标来找雨水的宽就可以,求得宽以后,两个相乘就可以得到雨水面积!:这个题在单调栈的情况下转了一个弯,就是需要取一个模操作,用来模拟一个数组的循环过程!

2023-08-26 21:30:07 137

原创 代码随想录第五十天

动规五部曲:1、dp数组的含义:dp[i][0]表示一开始不操作的情况、dp[i][1]表示第一次持有(不一定第i天才买入)、dp[i][2]表示第一次不持有(不一定第i天才卖出)、dp[i][3]表示第二次持有(不一定第i天才买入)、dp[i][4]表示第二次不持有(不一定第i天才卖出);3、dp数组初始化:由于后面的都是由dp[0][:]的时候推导得到,所以我们初始化dp[0][:],dp[0][0]=0因为一开始的金额是0;dp[0][4]这里可以看做是第一天买入又卖出又买入又卖出!

2023-08-26 18:49:45 1843 1

原创 代码随想录第五十八天

这里要找第一个比他大的元素,那么我们需要使用单调递增的栈,依次遍历数组中的元素,如果当前的元素大于栈顶的元素那么,就要更新res数组,直接当前的元素不大于栈顶的元素为止,否则把当前数的下标加入栈中!:这题还是典型的单调栈,主要是要建立一个哈希映射,我们对nums2里面的元素进行遍历,当发现一个元素右边出现第一个比它大的时候,我们就检查当前的元素有没有在nums1中出现过,如果出现过,则放入结果集,否则直接poll掉就可以!:两层for,超时!:绕了一下没想出来!

2023-08-24 23:38:35 59

原创 代码随想录第五十七天

5、打印dp数组:主要用于debug!5、打印dp数组:主要用于debug!:这个思路空间复杂度进行了优化,主要是找一个中心点,然后向两边扩散,中心可能是一个元素,也可能是两个元素,一个元素的时候中心点有length个,两个元素的时候中心点有length-1个,所以是2*length-1个中心点,然后就是left和right的初始化,有可能left和right是相等的,也有可能是挨着的,所以我们初始化right的时候要看i的奇偶,主要是left的初始化,i/2是为了可以遍历所有的字符。

2023-08-24 23:37:01 72

原创 代码随想录第五十六天

直接动规五部曲:1、dp数组的含义:以s1[i-1]结尾的s1和以s2[j-1]结尾的s2,怎么操作才可以由s1变到s2;=s2[j-1],这种情况下,我们就需要做增删替换了,我们可以将s1[i-1]删掉,就变成了dp[i-1][j]+1,将s2[i-1]删掉,就变成了dp[i][j-1]+1,这里其实是可以动s2的,因为s1的增相当于s2的删,s1的删相当于s2的增,还有一种情况是替换的情况,我们需要替换一个元素可以达到(1)的效果,那么就是dp[i-1][j-1]+1;:最长公共子序列的思路!

2023-08-24 23:35:47 160

原创 代码随想录第五十五天

动规五部曲:1、dp数组的含义:dp[i][j]表示以s[i-1]结尾的字符串包括多少个以t[i-1]结尾的字符串!2、递推公式:主要是分两种情况:(1)、当s[i-1]==t[j-1]的时候,在这种情况下dp[i][j]是等于dp[i-1][j-1]的,但是这里还要分情况,既然这两个元素相等了,那么我可以先把它删除掉,这样的话dp[i][j]就等于dp[i-1][j]了,这里为什么只有i-1呢,因为我们是要在s里面删除元素,而不是在t里面删除元素,所以要把这两个加起来;:没想到转换的思路!

2023-08-24 23:32:51 64

原创 代码随想录第五十二天

动规五部曲:1、dp数组的含义:dp[i][j]表示以nums[i-1]和nums[j-1]为结尾的最长重复数组的长度,这里为什么要定义i-1和j-1呢,如果我们假设定义的是以nums[i]和nums[j]为结尾的最长重复数组的长度的话,那么我们在dp数组初始化的时候,dp[i][0]和dp[0][i]需要遍历两个数组才可以得到值,相当于dp数组的第一行和第一列,这样就会麻烦很多,所以我们这样来定义dp数组;5、打印dp数组:主要用于debug!:思路差不多,没调出来!

2023-08-24 23:28:58 61

原创 代码随想录第五十一天

3、dp数组初始化:dp[0][0]可以直接看出来是-prices[0],主要是后面几个,我们拿dp[0][2]举例,第0天保持卖出状态的最大值,很显然是一个不合理的状态,所以我们要看他和哪个状态有关,根据那个状态进行分析,谁能由他得到呢,很明显dp[0][0]是可以,又因为dp[0][0]的值是-prices[0],所以dp[0][2]只能是0;5、打印dp数组:主要用于debug!:这个题和之前的题不同的地方在于交易需要手续费,这道题可以把手续费加到买入的时候,也可以把手续费加入到卖出的时候,都可以!

2023-08-24 23:27:45 25

原创 代码随想录第四十九天

动规五部曲:1、dp数组的含义:dp[i][0]表示第i天持有这个股票所产生的最大利润,dp[i][1]表示不持有这个股票所产生的最大利润,注意我们这里持有这个股票不代表第i天买入的,也可能之前就买入了,我们这里不持有这个股票也不代表第i天卖出,也可能之前就卖出了;假设当天不持有这个股票:(1)、之前就不持有这个股票dp[i-1][1](2)、第i天才不持有这个股票dp[i-1][0]+prices[i];dp[0][1]=0(当天不买入);找累计利润最大的时候就是我们能得到的最大利润!

2023-08-24 23:23:51 92

原创 代码随想录第四十八天

当不偷当前结点的房间时,我们要分情况进行讨论,因为我们不一定必须偷左右孩子的房间,我们要从中选择最大值来判断,所以val=max(left[0],left[1])+max(right[0],right[1]),然后将这两个数组成一维数组返回即可!3、dp数组初始化:由于当前的最大金钱和前面两个状态有关,所以所有的值一定是和dp[0]和dp[1]有关,dp[0]表示0-0的最大金钱,所以一定选下标为0的房间,dp[1]是0-1的最大金钱,所以只能选一个,选最大者即可;:不好处理环的问题!

2023-08-14 09:57:56 230

原创 代码随想录第四十六天

这道题主要是分析背包是什么,物品又是什么?动规五部曲:1、dp数组的含义:dp[i]表示当字符串长度为i的时候,是否可以由单词组成;2、递推公式:我们当前的字符串是否可以由单词组成主要是看上一个dp是否可以由单词组成并且这段区间上的字符串是否是字典里的某个单词,如果不是,则false;3、dp数组初始化:我们要把dp[0]初始化为true,不然后面都是false了,其他都初始化为false,因为我们并不清楚后面的是什么;4、遍历顺序:因为这道题我们是可以考虑排列的,所以先遍历背包!

2023-08-14 09:57:24 89

原创 代码随想录第四十五天

动规五部曲:1、dp数组的含义:dp[j]表示的是当总金额为j时组成总金额的钱币的最小数量!:之前是用斐波那契做的,但是现在学了完全背包,可以将m=2拓展的更大一点,我们可以将楼顶n设为背包的容量,将m设为物品的容量,我们每次选物品,而且物品可以重复,问可以有多少种不同的选法,而且这种是要考虑顺序的问题的,所以和之前的组合总和其实是一个题目!:只是改变了一下循环中的参数的定义,其他基本都是不变的,这个题一定可以由完全平方数组成,所以我们初始化的时候非零的索引初始化为n,因为dp[n]最大是n!

2023-08-14 09:56:29 182

原创 代码随想录第四十四天

2、递推公式:这道题和前面零钱兑换的题一样,都是求组合数,可以直接使用前面的求组合数的递推公式,也就是dp[j]+=dp[j-coins[i]],因为当我们固定一个的数的时候,组合的情况是把其他数所有的情况加起来!4、遍历顺序:这道题必须先遍历物品后遍历背包,因为求的是组合数,如果先遍历背包后遍历物品的话,那么每次初始化一个背包的容量,都是遍历一次之前已经遍历过的物品,会重复,比如会出现{1,2}和{2,1}两种情况,所以我们要先遍历物品后遍历背包才可以!:想不到,忘记这个递推公式了!

2023-08-14 09:55:55 285

原创 代码随想录第四十三天

题目链接最后一块石头的重量 II自己的思路:想不到是背包问题!!!正确思路:这道题让我们找撞击以后的石头的重量的最小值,其实这个题主要是要做个转换,转换成一个背包问题,那么怎么转换呢,我们可以思考把这堆石头分成两堆,两堆的重量极其接近的时候相互撞击就会得到最小重量的石头,也就是和之前那道题一样,将每一堆的石头的重量都尽可能地接近sum(石头重量总和)/2,这样分完以后有一堆是dp[sum/2],另一堆就是sum-dp[sum/2],一定是后者大或者相等,因为除以2是向下取整;

2023-08-14 09:55:21 61

原创 代码随想录第四十二天

先说一下0-1背包:有n个物品,weight[i]代表第i个物品的重量,value[i]代表第i个物品的价值,现在有一个可以盛放重量为m的背包,问怎么放可以使得背包的价值最大!我们再来看这道题,这道题我们可以理解为从数组里找几个数,几个数的和==sum(数组总和)/2就可以,是在问重量为sum/2的背包可以装价值为sum/2的物品吗,这里我们假设物品的重量和价值是相等的!2、递推公式:根据一维背包数组可以得出dp[i]=max(dp[i],dp[i-nums[i]]+nums[i]);

2023-08-14 09:54:44 196

原创 代码随想录第四十一天

从题目中可以看出dp[i]一定和他前面的有关系,因为如果固定了一个头结点,我们可以发现左边是一个子树,右边也是一个子树,那么就降低了一个维度,变成了dp[j]的问题了,所以动规五部曲:1、dp数组的含义:dp[i]表示当n=i时所能产生的二叉树的情况;头结点为i的情况,那么我们就分情况,当头结点为j的时候,左边一定有j-1个数,那么他构成的子树的情况是dp[j-1],那么右边就是dp[i-j],又因为要将这些头结点相加,所以要累加!5、打印dp数组,主要用于debug!

2023-08-14 09:54:11 68

原创 代码随想录第三十九天

3、dp数组初始化,由于在后面进行遍历的时候,当我们需要第一行的元素或者第一列的元素的时候,它的值不能是任意的,所以我们要考虑将他们初始化,因为后面所有的数都是由这两条所产生的,我们拿第一行分析,我们要走到第一行第j列的时候,dp[0][j-1]一定是1,因为只有一种路径可以走到这,只能直着走,题目规定只能向右或者向下,所以其他的也初始化为1;递推公式:其实也是做了一点变换,当我们遍历到当前点为石头的时候,我们将dp[i][j]置为0,否则我们还是把它置为dp[i-1][j]+dp[i][j-1]!

2023-08-14 09:53:38 78

原创 代码随想录第三十八天

这道题是让我们找上第n条台阶的最小花费,我们可以在上一题的基础上进行思考,当我们要让第n条台阶的时候,可以通过第n-1条台阶走一步上来,也可以通过第n-2条台阶走两步上来,那么既然我们要求上第n条台阶的花费的最小值,题目还说如果要向上走就要有对应的花费,所以我们上第n条台阶的最小值=min(上第n-1条台阶的最小值+cost[n-1],上第n-2条台阶的最小值+cos[n-2]),所以我们就可以推导出递推公式来。2、递推公式,这道题已经给了我们递推公式dp[i]=dp[i-1]+dp[i-2];

2023-08-14 09:53:00 56

原创 代码随想录第三十七天

大致思路是从后向前遍历,不可以从前向后,如果从前向后没有保证单调递增的顺序,所以从后向前遍历,如果当前位的前一位大于当前位,说明是递减的,所以我们就把前一位–,然后记录一下当前位的索引,我们后面把这个索引对应的数标志为’9’,然后我们向前遍历,如果当前位前一位大于当前位,我们就更新这个标志位,然后把这个标志位到最后的数都变为’9’,一直重复,然后最后赋值’9’,最后返回结果即可!

2023-08-07 08:28:05 84 1

原创 代码随想录第三十六天

还是老规矩,先将区间按左边界进行排序,排序好之后,我们先把第一个区间加入到res数组中,这样方便我们后续对他更改,遍历二维数组,当当前的区间的左边界小于等于上一个区间(我们res数组的最后一个元素)的右边界的时候,说明重合了,我们选择更新上一个区间,上一个区间的左边界不动,只更新右边界,右边界变为这个区间的右边界和上一个区间(res数组的最后一个元素)的右边界的最大值,否则我们说明和上一个区间(我们res数组的最后一个元素)不重合,直接把当前区间加入到res数组即可!:没想到,区间的还是不熟!

2023-08-07 08:27:06 91

原创 代码随想录第三十五天

先按从小到大的顺序将每个气球的左边界排序,这样就比较好比较了,我们可以比较当前气球的左边界和上一个气球的右边界,如果当前气球的左边界大于上一个气球的右边界,说明一定不重叠而且不挨着,索引我们需要再加一支弓箭,否则我们需要更新我们的右边界来看一下后面还有没有气球是可以一起射下来的,当前数组的右边界更新为当前数组的右边界和上一个数组右边界的最小值,然后遍历整个数组就可以了!不过好歹是自己想出来的哈哈哈哈哈!:和我的思路是一样的,只是我是用Map存的个数(我是智障),正确的应该使用两个数字来存储个数就可以!

2023-08-07 08:26:02 164

原创 代码随想录第三十四天

贪心:不要两边一起处理,先处理一边!我们可以模拟从第0个加油站就当做起点的时候,然后依次把自己得到的油和消耗的油相减,并做加和统计,如果这个和小于0了,说明没法再往前走了,然后把这个加和置为0,使用start记录一下当前索引的下一个位置,因为我们要从下一个位置开始走,因为前面的一段区间都没法当做起点,然后一直循环往复,在整个遍历的过程中,我们将所有得到的油减去所有消耗的油,如果说最后这个值小于0,说明没法走到终点,否则的话我们就把前面记录的start返回即可!:真的难想,第一遍根本想不到!

2023-08-07 08:25:12 78

原创 代码随想录第三十二天

不需要去关注每次跳几步才能到终点,只需要关注当前点索引+当前点索引对应的值的大小,遍历整个数组,找出最大的那个,如果最大的那个可以到终点,那么说明可以到终点,如果不可以,则不能到终点!:贪心贪在最少步数到终点!好像句废话,这道题和跳跃游戏题目类似,其实都是从覆盖范围上考虑,我们只需要关注最大覆盖范围的,记录最大的覆盖范围和当前点的覆盖范围!:遇到相邻两天的正利润就收集到结果中,贪心贪在如果相邻两条不是正利润我就不买也不卖!:只能说一道题一个样,完全没思路!

2023-08-07 08:24:20 216

原创 代码随想录第三十一天

思路:定义两个变量pre和cur,pre表示当前点的前一个坡度,cur表示当前点的后一个坡度,一共有三种情况,一种是一直在震动,一种是先向上(向下)然后平坡最后向下(向上),最后一种是先单调再平坡,第一种情况不用说,就是判断前一个坡度和下一个坡度是否是异号,第二种情况和第三种情况都将平坡的排除掉,当出现震动的时候才将pre赋值为cur!局部最优推全局最优,局部最优为让大的饼干给胃口大的孩子吃,思路就是尽量让大的饼干喂大胃口的小孩子,定义一个index来控制饼干的移动!:之前做过一遍,但是还是不会做!

2023-07-31 09:05:34 275

原创 代码随想录第三十天

难点在于之前处理的都是一维数组,现在转变为了而且数组,这个题难点在于思想上的转变以及对判断当前二维数组是否有效的判断(其实函数也不难);回溯三部曲:1、传入参数:当前棋盘,当前遍历棋盘的行数以及总行数n;2、返回值:当遍历棋盘的行数等于总行数的时候,将数组加入到结果集中;3、单层逻辑:先判断当前棋盘是否有效,如果有效,将当前点赋值为’Q’,然后递归回溯,否则判断下一个棋盘是否有效!:这道题也是非常难得题,因为我不会!:看着很难的一道题,但其实确实难!

2023-07-31 09:04:52 86

原创 代码随想录第二十九天

首先题目要求必须得数组长度大于1才可以加入到结果集中,第二去重的方式,这里选择每一层来维护一个used数组,如果之前使用过这个元素,则直接continue;3、单层逻辑:先判断加入到的元素是否满足要求,path是否为空,当前元素是否小于path中最后一个元素,used数组是否已经使用过这个元素,如果都满足,才可以递归、回溯,注意回溯的时候,不要给used数组赋值0,因为是一层来维护一个used数组。3、单层逻辑:从索引0开始遍历,当used使用过这个元素,跳过这个元素,如果没有使用过,递归、回溯!

2023-07-31 09:04:12 80

原创 代码随想录第二十八天

这道题和分割回文串很像,因为在进行下一次递归的时候都会判断一段区间是否合法,如果不合法直接下一个分割方案,而且这个题的终止条件为逗点数为3,但是逗点数为3的时候,说明前三个字符已经判断合法了,但是我们在加入之前还是要判断最后一个字符是否合法,如果合法我们才会把它加入到结果集中,难点在于思考什么当做终止条件和在下次递归的时候,startindex要加2,因为递归之前给他加了一个逗点,所以需要加2;2、终止条件:先加入path到res结果集中,然后再终止,当startindex指向res的后面的时候,终止;

2023-07-31 09:03:29 102

原创 代码随想录第二十七天|

数层去重就是要定义一个used数组,用来标记是否已经使用过一个数,如果说当前元素的前一个元素我们没有使用过,说明是数层,否则是树枝,所以我们去重的逻辑是,当前的数如果等于前一个数而且前一个数如果没有使用过,则直接continue,去重;3、单层逻辑:考虑剪枝,当当前和大于target的时候,后面都可以不要了,把当前值加入到path中,然后cursum加上当前值,然后递归,然后path弹出最后一个元素,cursum再减去当前值!:没想到,难点在于如何去切割回文串,没有想到按区间去切割!:没想到如何去去重!

2023-07-31 09:02:41 78

原创 代码随想录第二十五天|

这个题和组合问题不同的就是引入一个和的问题,所以递归函数传入参数会多一个sum参数,在最后加入path的时候要进行判断一个,满足和的条件就加入到结果中;3、单层逻辑:先将i加入到path中,然后给sum加上i,然后递归,然后回溯,将i从path中拿出来,并且sum减i!3、单层逻辑:先找到当前字符串中字符在map中映射的字符串,然后遍历该字符串,先加入当前字符串中字符,然后递归,然后回溯即可!:感觉还是自己太懒了,不想思考,只想看题解,然后背思路,要改掉,要改掉!其实感觉不是那么难,就是自己不想思考!

2023-07-31 09:01:29 345

原创 代码随想录第二十四天

回溯就是for循环里面套递归,这个题很好理解,但是不好写代码,我们假设n=4,k=2来处理,第一次从n里面挑一个1,然后再把234拿出来,只拿比1大的,然后再从234里面拿,分别拿2、3、4,这样就构成了[1,2]、[1,3]、[1,4],其他的也是同理,说明终止条件就是数组大小满足k的时候就加入进来,for循环里面从1到n,每次的起始点也不同;3、单层逻辑:for循环用于指定不同的初始值,先把当前初始值加入进来,然后使用递归函数进行递归,然后再把当前值去除掉(回溯)!

2023-07-24 19:21:29 37

原创 代码随想录第二十三天

随便找一个节点当中节点,然后左右递归即可,但是这个题还要求是高度平衡的二叉树,所以我们选择一个区间的中间点作为二叉树的根节点,然后依次左右递归;2、终止条件:当当前的区间不存在的时候,返回空节点;3、单层逻辑:先找到当前区间的中间的索引,然后以该索引对应的值作为新的二叉树的头结点,然后依次递归左右子树即可!3、单层递归逻辑:左右递归分别返回给当前结点的左右子树!3、单层逻辑:先右递归,然后把上一个节点,也就是比他的节点的值加到此节点上,然后把上一个节点的值变为当前结点的值,再进行左递归即可!

2023-07-24 19:20:32 38

原创 代码随想录第二十二天

2、终止条件:当当前节点为空的时候,返回新建的节点,返回到上一个节点的左或者右节点,具体看下面;3、单层逻辑:当当前节点的值大于val的话,说明要插到左子树里面,返回值为root.left,因为是插到root的左子树里,否则插到右子树里,然后返回当前结点!2、终止条件:当当前节点为空的时候,直接返回空,当当前结点的值等于key的时候,要分情况处理,:当左节点不为空,右节点也不为空时,要进行树的变换,我们以删除以后右节点上位为例,那么删除以后的左节点会放到右子树的最左边的非空节点下面即可;

2023-07-19 19:44:49 1300

原创 代码随想录第二十一天

首先是计数阶段:当pre是空的时候,那也就是说node现在是出于叶子节点,记录它的count值为1,当pre的结点值等于node的结点值的时候,说明出现了相同的节点值,则count++,当pre的结点值不等于node的结点值时,说明出现了不同的节点值,重置count为1;3、单层逻辑:先左递归,然后处理中间节点,然后右递归!因为中序遍历可以保证是递增的,这样就不会跳着比较,所以先递归左子树,然后中节点和前一个节点求差值的绝对值和res比较,取最小值为res,然后再定义新的pre,再进行右子树的遍历即可!

2023-07-19 19:44:14 1182

原创 代码随想录第二十天

最简单的思路是使用一个值来记录之前所有元素的最大值,然后进行中序遍历,因为这样可以保证数据是递增的,但是这样做有一个缺点就是可能之前树中的节点就是long或者int的最小值,直接就返回false了,所以我们采用临时变量记录上一个结点,用这个节点和上一个节点表示,如果大于上一个节点,正常运行,1否则返回false;2、传入参数:当前节点;:构造二叉树要用前序遍历!:迭代来找,利用二叉树搜索树的特点,如果当前结点的值大于val,则向左找,如果当前结点的值小于val,则向右找,否则返回当前结点!

2023-07-18 22:09:31 99

原创 代码随想录第十八天

给定了中序遍历左中右和后序遍历左右中,如果想构造出二叉树来,那么一定要找到后序遍历的最后一个节点,通过这个节点来拆分中序遍历的左右子树,然后拆分出中序遍历的左右子树,通过左右子树的长度进而确定后序遍历中的左右子树即可!3、单层逻辑:当当前深度大于最大深度的时候,更新最大深度和res的值,然后进行左右递归,注意,这里必须先进行左递归,因为最后的res的值可能出现在左节点上,也可能出现在右节点上,这样的目的是保证如果最后一层左节点在最左边,那么结果一定是它的值!3、单层逻辑:左右进行递归,然后回溯当前节点!

2023-07-18 22:08:23 169

原创 代码随想录第十七天

这道题只想到了前序遍历,因为是加入所有的路径,必须要用父节点指向子结点,必须要用中左右的顺序,而且这道题还用到了回溯,因为每次加入一个路径之后,如果想再加入另外的路径,必须对其进行回溯才可以!3、单层逻辑:然后将此节点的值转化成字符串加入到path中,然后再判断是否是叶子节点,如果先判断叶子节点的话,会导致最后的路径中没有叶子节点,左右递归,当左右递归之后,还要进行回溯的逻辑,为什么要回溯,前面说了!3、单层逻辑:当前节点的左节点不为空,但是左节点为叶子节点的时候,将它加到sum上!

2023-07-18 22:07:11 126

空空如也

空空如也

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

TA关注的人

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