自定义博客皮肤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)
  • 收藏
  • 关注

原创 代码随想录算法训练营总结

还是有些恍惚,两个月的算法训练就这么结束了。从来没想过三分钟热度,做事虎头蛇尾的自己,能完完整整坚持两个月的刷题。一直觉得自己在逻辑思维这个层面上是稍弱的,接触算法这三年以来,一直对其抱有“敬而远之”的态度,认为自己“不是学算法的料”。每当我打算好好钻研算法,那比砖还厚的《算法导论》以及庞杂反复的算法知识点筑起的厚厚壁垒仿佛就在告诉我:“算了吧,这个领域不是一介普通人所能触碰的”偶然在网上看到了卡哥的《代码随想录》,感觉讲的挺好的,下定决心报了个算法训练营,其实也没指望完成吧,当时是抱着“试试看,相当于有个

2024-05-22 15:03:55 484 1

原创 代码随想录算法训练营第六十天|LeetCode503.柱状图中最大的矩形

还是有些恍惚,两个月的算法训练就这么结束了。从来没想过三分钟热度,做事虎头蛇尾的自己,能完完整整坚持两个月的刷题。一直觉得自己在逻辑思维这个层面上是稍弱的,接触算法这三年以来,一直对其抱有“敬而远之”的态度,认为自己“不是学算法的料”。每当我打算好好钻研算法,那比砖还厚的《算法导论》以及庞杂反复的算法知识点筑起的厚厚壁垒仿佛就在告诉我:“算了吧,这个领域不是一介普通人所能触碰的”

2024-05-21 13:59:00 261

原创 代码随想录算法训练营第五十九天|LeetCode503.下一个更大元素II 、LeetCode42.接雨水

当前元素要是比栈顶元素大,那么当前元素就是栈顶元素右边第一个比他大的元素。因为是单调递增栈,所以栈内第二个元素其实就是左边第一个比栈顶元素大的元素。1)将当前栈顶元素和当前元素取最小值,再用最小值减去中间柱子的高度。也就是当前柱子左边第一个比他高的元素,以及右边第一个比他高的元素。一直将栈顶元素弹出,直到栈顶元素大于当前遍历元素。一直将栈顶元素弹出,直到栈顶元素大于当前遍历元素。当前元素下标的值比栈顶元素下标的值大。当前元素下标的值等于栈顶元素下标的值。当前元素下标的值比栈顶元素下标的值小。

2024-05-20 17:17:27 750

原创 代码随想录算法训练营第五十七天|LeetCode739.每日温度 、LeetCode496.下一个更大元素I

可以用map做银蛇,根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。在遍历nums2的过程中,需要判断nums2[i]是否在nums1中出现过。2.定义一个result数组(结果集),大小为nums1的大小,初始化为0。5.遍历nums1,将nums1的元素和下标记录到HashMap中。判断栈顶元素是否在nums1中出现过,如果出现过,记录结果。一直将栈顶元素弹出,直到栈顶元素大于当前遍历元素。一直弹出栈顶元素,直到当前元素小于栈顶元素。当前元素下标的值等于栈顶元素下标的值。

2024-05-18 19:57:48 362

原创 代码随想录算法训练营第五十六天|LeetCode647.回文子串 、LeetCode516.最长回文子序列

说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。表示区间范围[i,j]的子串是否为回文子串,如果是:dp[i][j]为true;字符串s在[i,j]范围内最长的回文子序列的长度为dp[i][j]此时s[i]与s[j]已经相同,看看区间内的子串是不是回文就行。将所有dp[i][j]全初始化为false。保证dp[i+1][j-1]都是经过计算的。2.从后往前遍历初始化dp[i][i]=1。布尔类型的dp[i][j]

2024-05-17 08:40:16 385

原创 代码随想录算法训练营第五十五天|LeetCode583.两个字符串的删除操作 、LeetCode72.编辑距离

dp[i][j]:表示以下标i-1为结尾的word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。dp[i][j]:表示以下标i-1为结尾的word1,和以j-1为结尾的字符串word2,最近编辑距离为dp[i][j]word2为空字符串,以i-1为结尾的字符串word1要要删除i个元素才能和word2相同。word1为空字符串,以j-1为结尾的字符串word2要要删除j个元素才能和word1相同。操作三:word1替换word1[i-1],使其与word2[j-1]相同。

2024-05-16 13:13:17 941

原创 代码随想录算法训练营第五十四天|LeetCode392.判断子序列、LeetCode115.不同的子序列

从递推公式可以看出dp[i][j]都是依赖于dp[i-1][j-1]推出来,因此需要初始化dp[0][0],dp[i][0]从递推公式可以看出dp[i][j]都是依赖于dp[i-1][j-1]推出来,因此需要初始化dp[0][j],dp[i][0]dp[i][j]:表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]dp[i][j]:表示以下标i-1为结尾的子序列s中出现以j-1为结尾的t的个数为dp[i][j]空字符串s,可以删除0个元素,变成空字符串t。

2024-05-15 20:21:31 754

原创 代码随想录算法训练营第五十三天|LeetCode1143.最长公共子序列、LeetCode1035.不相交的线、LeetCode53.最大子序和

dp[i][j] :长度为[0,i-1]的字符串和长度为[0,j-1]的字符串的最长公共子序列为dp[i][j]dp[i][j] :长度为[0,i-1]的字符串和长度为[0,j-1]的字符串的最长公共子序列为dp[i][j]从递推公式可以看出dp[i]是依赖于dp[i-1]的状态推出来的,因此dp[0]就是递推公式的基础。dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]text1[0,i-2]与text2[0,j-1]的最长公共子序列。

2024-05-14 08:53:08 710

原创 代码随想录算法训练营第五十二天|LeetCode300.最大递增子序列、LeetCode674.最长连续递增子序列、LeetCode718.最长重复子数组

dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。dp[i]是由0到i-1各个位置的最长递增子序列推导出来的,所以i一定是从前向后遍历。dp[i]表示的是i之前以nums[i]为结尾的最长递增子序列的长度。dp[i]表示的是以下标i为结尾的连续递增的子序列长度为dp[i]每一个i,对应的dp[i](最长递增子序列)初始大小至少都是1。dp[i]是依赖dp[i-1]推出来的,所以一定是从前向后遍历。如果nums[i] > nums[i-1]

2024-05-13 18:08:31 472

原创 代码随想录算法训练营第五十天|LeetCode309.买卖股票的最佳时机(含冷冻期)、LeetCode714.买卖股票的最佳时机(含手续费)

第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]第i天买入股票,所得现金就是买入今天的股票后所得现金即:dp[i-1][1]-prices[i]求的结果是dp[len-1][0]和dp[len-1][1]中的最大值。dp[0][1]=0。

2024-05-11 14:40:43 610

原创 代码随想录算法训练营第四十九天|LeetCode123.买卖股票的最佳时机III、LeetCode188.买卖股票的最佳时机IV

从递推公式可以看出dp[i]都是由dp[i-1]推导出来,所以一定是从前向后遍历。求的结果是dp[len-1][0]和dp[len-1][1]中的最大值。dp[i][2]表示第i天第一次不持有(第一次卖出)的最大现金。dp[i][1]表示第i天第一次持有股票所得到的最大现金。dp[i][4]表示第i天第二次不持有股票的最大现金。那就是第i-1天不持有股票的现金减去第i天股票的价格。dp[i][3]表示第i天第二次持有股票的最大现金。则dp[i][j]表示的是第i天不持有股票的现金数。

2024-05-10 15:40:18 622

原创 代码随想录算法训练营第四十八天|LeetCode121.买卖股票的最佳时机、LeetCode122.买卖股票的最佳时机II

第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]第i天买入股票,所得现金就是买入今天的股票后所得现金即:dp[i-1][1]-prices[i]求的结果是dp[len-1][0]和dp[len-1][1]中的最大值。3.初始化dp[0][0]=-prices[0];求的结果是dp[len-1][0]和dp[len-1][1]中的最大值。

2024-05-09 22:20:46 620

原创 代码随想录算法训练营第四十七天|LeetCode198.打家劫舍、LeetCode213.打家劫舍II、LeetCode337.打家劫舍III

1.如果nums为空,或者nums的长度为0,return0。1.如果nums为空,或者nums的长度为0,return0。2.如果nums.size==1,返回nums[0]dp[i]:考虑下标i能偷的最大的金币数dp[i]dp[i]:考虑下标i能偷的最大的金币数dp[i]dp[i]:考虑下标i能偷的最大的金币数dp[i]2.如果nums的长度为1,返回nums[0]2.如果nums的长度为1,返回nums[0]最终返回的是dp[nums.size-1]最终返回的是dp[nums.size-1]

2024-05-08 09:19:14 753

原创 代码随想录算法训练营第四十六天|LeetCode139.完全平方数

在当前轮遍历的时候发现增加了容量的背包可以再添加一个物品1,就会有【物品1,物品2,物品1】这样的情况,所以很可能会有物品1出现在物品2之类的情况。在上一轮遍历到物品3时,当前容量的背包已经没有办法塞入物品3,因此背包里此时有物品1和物品2。字符串长度为i的话,dp[i]为true,表示可以拆分为一个或多个在字典中出现的单词。物品1已经被添加进每一个不同容量的背包里,因此物品2肯定会在物品1之后。在大小固定的背包里循环遍历添加物品,直到物品全遍历一次。2)物品遍历结束,外层背包容量+1。

2024-05-07 07:50:37 413

原创 代码随想录算法训练营第四十五天| 卡码网57.爬楼梯、LeetCode322.零钱兑换、LeetCode279.完全平方数

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])因此在dp[j-coins[i]]执行+1操作前,也就是在递推公式前,需要判断dp[j-coins[i]]是否为最大值,如果为最大值,就没有考虑的必要!在当前轮遍历的时候发现增加了容量的背包可以再添加一个物品1,就会有【物品1,物品2,物品1】这样的情况,所以很可能会有物品1出现在物品2之类的情况。

2024-05-06 09:03:17 1821

原创 代码随想录算法训练营第四十四天| 完全背包、LeetCode518.零钱兑换II、LeetCode474.组合总和IV

每个物品可以使用无数次和01背包的区别:1.因为每个物品可以使用无限次,所以要将遍历背包的顺序改成正序遍历2.完全背包中,先遍历背包还是先遍历物品都可以【注意】前提条件是纯完全背包问题。

2024-05-05 21:31:46 543

原创 代码随想录算法训练营第四十三天| LeetCode1049.最后一块石头的重量 II、LeetCode494.目标和、LeetCode474.一和零

1049. 最后一块石头的重量 II - 力扣(LeetCode)

2024-05-05 21:24:28 485

原创 代码随想录算法训练营第四十二天| 01背包理论基础、LeetCode416.分割等和子集

1.确定dp数组以及下标的含义dp[i][j]的定义为:[0-i]之间的物品任取,放进容量为j的背包里2.确定递推公式分两种情况:放物品i:当背包容量为j-weight[i]的时候不放物品i的最大价值不放物品i:dp[i-1][j]当背包容量为j的时候不放物品i的最大价值综合两种情况考虑:3.确定dp数组如何初始化1.将dp[i][0]全部初始化为0意思是当背包容量为0的时候,背包什么也放不了,因此总价值是02.将dp[0][j]全部初始化为物品0的价值。

2024-04-30 21:13:31 914

原创 代码随想录算法训练营第四十一天| LeetCode343.整数拆分、LeetCode96.不同的二叉搜索树

左子树有j-1种情况(这里的j代表当做头节点的数值,左边必须比j小,因此是j-1种)其实这里j的最大值为i-j,再大也只不过是重复,因此只需要遍历到i-j即可。dp[i]的定义为:对i进行拆分,拆分后得到最大的乘积为dp[i]dp[i]的定义为:1到i为节点组成的二叉搜索树的个数为dp[i]从1开始拆分i(也就是从j=1开始遍历,到j

2024-04-29 09:29:26 311

原创 代码随想录算法训练营第三十九天| LeetCode62.不同路径、LeetCode63.不同路径II

如果有障碍,则障碍之后都为0,所以要加一个判断条件在for循环里obs[i][0] ==0,obs[0][j] == 0。dp[i][j]的定义为:从(0,0)到(i,j)有dp[i][j]条不同的路线。dp[i][j]的定义为:从(0,0)到(i,j)有dp[i][j]条不同的路线。2.递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1]2.递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1]5.返回要求的指定位置的dp数组中的元素。

2024-04-27 09:40:58 390

原创 代码随想录算法训练营第三十八天| LeetCode509.斐波那契数、LeetCode70.爬楼梯、LeetCode746.使用最小花费爬楼梯

因为dp[0]无论是等于0还是等于1都能说通,为了避免争议,我们初始化dp[1]=1,dp[2]=2。dp[i] = dp[i-1]+dp[i-2](斐波那契数)3.按照题目给的数值,初始化dp[1]=1,dp[2]=2。dp[i]的定义为:到达第i层所花费的最少体力为dp[i]dp[i]的定义为:第i个数的斐波那契数值是dp[i]dp[i]的定义是:爬到第i层楼梯,由dp[i]种方法。3.按照题目给的数值,初始化dp[0]和dp[1]题目也已经告诉我们了dp[0]和dp[1]的值。

2024-04-26 16:58:44 607

原创 代码随想录算法训练营第三十七天| LeetCode738.单调递增的数字

注意:千万不要将start初始化成0!因为如果if逻辑没有走到,那么下面的for循环会从0开始将所有位的数值赋值成0!2.将转为string的值再转为char数组,在char数组上原地修改,效率更高。如果发现该数字的前一位比后一位大,那么前一位就做-1处理,后一位变为9。1.将传进来的int值转化为String类型,目的是为了方便遍历。3.定义一个start变量,记录我们需要从哪里开始修改数值为9。将start位置以及之后的位置的值全改为9。需要采用从后往前的遍历。

2024-04-25 17:05:55 261

原创 代码随想录算法训练营第三十六天| LeetCode435.无重叠区间、LeetCode763.划分字母区间、LeetCode56.合并区间

【解题思路】需要先将数组按照左/右边界排序,这里按照左边界排序来解如果第i个区间的左边界大于等于i-1区间的右边界【解题步骤】1.判断数组大小,如果等于0,则return 0;2.对数组的左边界进行排序3.定义一个result,初始化为0,记录重叠区间的数量3.遍历数组(i从1开始,因为比较的时候是i-1和i进行比较,从0开始会出现负数):如果当前元素左边界小于上一个气球的右边界:result++当前元素右边界和上一个元素右边界取最小值更新当前元素的右边界【代码部分】

2024-04-24 10:33:50 442

原创 代码随想录算法训练营第三十五天| LeetCode860.柠檬水找零、LeetCode406.根据身高重建队列、LeetCode452.用最少数量的箭引爆气球

5.如果直到循环结束,都没有走到return false的逻辑,说明我们可以对所有账单找零,return true。2.我按照左边界来排,因此如果当前气球的左边界大于前一个气球的右边界,意味着这两个气球不重叠,需要添加一个弓箭。3.如果当前气球的左边界小于等于前一个气球的右边界,意味着这两个气球重叠,不需要添加弓箭。必须先处理一个维度,再处理另一个维度,比如可以先处理身高,再处理人数。1.按照左边界或右边界给气球进行排序,尽量让重叠的气球相邻。3.定义一个result,初始化为1,记录弓箭的使用数量。

2024-04-23 12:50:23 886

原创 代码随想录算法训练营第三十四天| LeetCode1005.k次取反后最大化的数组和、LeetCode134.加油站、LeetCode135.分发糖果

2.贪心解法:关注每一次补充消耗之后油箱剩余量是增加还是减少,一旦发现累加的剩余油量变成负数,那么就从变成负数的下一个位置元素开始,试试能不能跑完一整圈。如果cursum小于0,说明当前位置之前的位置都不适合作为起始位置,从当前位置之后的位置作为起始重新开始统计。比较当前孩子得到的糖果和后一个孩子得到的糖果+1后谁的多,将多的那个值赋给当前孩子所得糖果。如果当前孩子比前一个孩子评分高,则给当前孩子+1个糖果,否则只给当前孩子一个糖果。结合这两次策略,推出全局最优:相邻孩子中评分高的孩子获得的糖果更多。

2024-04-22 12:37:32 311

原创 代码随想录算法训练营第三十二天| LeetCode122.买卖股票的最佳时机II、LeetCode55.跳跃游戏、LeetCode45.跳跃游戏II

不要纠结于能往后跳多少步,只思考当前位置的覆盖范围,只要在覆盖范围内的元素我们在当前位置都能跳到。用next记录这一步走完后下一步的覆盖范围(只记录在当前覆盖范围内覆盖范围最大的元素)4.循环遍历数组(i的终止条件是小于等于cover,因为我们只能在覆盖范围内移动)2.如果数组里就一个元素,那么就一定可以跳跃到的,return true。如果范围内的元素包含最后一个元素,则返回true,否则返回false。原理同上,不过每一步我们需要尽可能的增加我们的覆盖范围。需要启动下一步的覆盖范围,result++

2024-04-20 10:03:11 472

原创 代码随想录算法训练营第三十一天| LeetCode455.分发饼干、LeetCode376.摆动序列、LeetCode53.最大子序和

3.如果单调坡中有平坡,就会出现错误统计prediff=0,crudiff>0的情况,所以我们当坡度的方向有变化(遇到了一个摆动)的时候prediff才跟着curdiff动,其他情况下如果出现坡度,prediff只记录坡度的方向。可以往左删元素也可以往右删元素,当出现这种情况的时候,prediff == 0,curdiff

2024-04-19 13:54:01 626

原创 代码随想录第三十天 | 回溯算法总结

个人感觉组合问题是相对基础的回溯算法问题类型,需要考虑的东西不算多,但是包含回溯算法特点的要素在组合问题里都有体现,因此,卡哥在这里给我们列举了k层for循环的例子,告诉我们为什么需要使用回溯算法———即该问题就算使用暴力搜索,也没办法控制for循环嵌套的次数,因此我们将for循环写进递归函数里,回溯函数其实也就是递归函数,回溯算法都是用递归函数实现的,是一种纯暴力的搜索方式,本质是穷举出所有的可能,然后选出符合条件的结果集。因此,组合问题的终止条件我们一般可以不加,因为每一次递归都需要+1。

2024-04-18 18:05:46 467

原创 代码随想录算法训练营第二十九天| LeetCode491.递增子序列、LeetCode46.全排列、LeetCode47.全排列II

3.排列类的问题不需要用startIndex标记取过的元素,但是需要用used数组标记取过的元素,组合问题之所以要用startIndex标记,是因为避免出现相同元素不同顺序的情况,但是排列问题是可以出现这种情况的,同一树层取过的元素是可以重复取的,只需要避免同一树枝重复的现象即可。因为set的作用只是记录当前递归的数值有没有重复,每一层递归,都会定义一个新的set,因此不用将元素从set移除!如果path不为空,且当前元素小于当前path里的最后一个元素,或者uset里存在当前元素。

2024-04-17 15:00:07 606

原创 代码随想录算法训练营第二十八天| LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II

【剪枝】题目给出的字符串长度为12,因此如果s的长度大于12,说明怎么样都不会合法,直接return result。5.如果遍历完当前区间的字符串,都没有return false,说明当前区间的字符串合法,return true。如果nums[i] == nums[i-1],并且used[i-1] == false。2.如果当前起始位置不等于终止位置,且开始位置字符为0,return false。递归,调用函数,传入s,i+2(因为加了点所以要+2)4.遍历传入的字符串,区间为[start,end]

2024-04-16 13:28:18 636

原创 代码随想录算法训练营第二十七天| LeetCode39.组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串

本题是一个分割问题,也可以看作一个树形结构,分割了一个字符之后,再从剩下的字符里进行分割。因为在单层搜索逻辑里已经有判断的逻辑了,如果当前不是回文,就不会进行下一次递归。本题我们可以重复选取元素,因此我们的遍历起始位置在本层是不变的,传入i。本题我们不可以重复选取元素,因此我们的遍历起始位置需要+1,传入i+1。本题元素可以重复选取,因此剩余的集合就需要包括当前选取的元素。调用递归函数,传入candidate,target,0,0。调用递归函数,传入candidate,target,0,0。

2024-04-15 13:27:26 671

原创 代码随想录算法训练营第二十五天| LeetCode216.组合总和III、LeetCode17.电话号码的字母组合

【剪枝】当我们剩余未遍历的元素个数满足不了我们所需要的元素个数,我们就没必要遍历了。用map或者二维数组来映射每一个数字对应的字符串,输出每一个可能的组合。如果index等于我们传入的字符串digits长度,说明遍历结束。回溯,将累加到sum的数减掉,将放入路径集合path的元素弹出。【全局变量】字符串string s表示当前路径下的单个结果。调用递归函数,传入digits,numString,0。将当前的s放入结果集result里,然后return。递归,调用函数,传入digits和index+1。

2024-04-13 14:07:48 313

原创 代码随想录算法训练营第二十四天| 回溯算法理论基础、LeetCode77.组合

所有用回溯算法解决的问题都可以抽象成为树型结构,因为回溯法解决的都是在集合中递归查找子集,。

2024-04-12 10:15:41 399

原创 代码随想录算法训练营第二十三天| LeetCode 669.修剪二叉搜索树 、LeetCode108.将有序数组转换为二叉搜索树、LeetCode538. 把二叉搜索树转换为累加树

说明当前节点需要删除,但是由于其孩子可能符合条件,因此应该继续向右遍历,用right接收返回值。说明当前节点需要删除,但是由于其孩子可能符合条件,因此应该继续向左遍历,用left接收返回值。调用递归函数,用root接收返回值,传入数组,0,数组的长度-1三个值,返回递归函数返回的值。递归调用递归函数,传入数组,左区间边界下标,和中间位置下标-1,用当前节点的左孩子接收。递归调用递归函数,传入数组,中间位置下标+1,右区间边界下标,用当前节点的右孩子接收。向右递归遍历,传入当前节点的右孩子。

2024-04-11 17:35:56 1041 1

原创 代码随想录算法训练营第二十二天 | LeetCode235.二叉搜索树的最近公共祖先、LeetCode701.二叉搜索树中的插入操作、LeetCode450.删除二叉搜索树中的节点

判断完左和右,剩下的情况,当前遍历节点一定在p和q中间,直接return cur即可。如果p和q都比当前遍历节点大的话,那么p和q的最近公共祖先一定在当前遍历节点的右侧。如果p和q都比当前遍历节点小的话,那么p和q的最近公共祖先一定在当前遍历节点的左侧。如果当前遍历节点大小在p和q的中间,那么p和q的最近公共祖先就是当前遍历节点。如果当前节点左子树左为空,右子树不为空,将当前节点的右子树直接向上返回。如果当前节点左子树不为空,右子树为空,将当前节点的左子树直接向上返回。

2024-04-10 15:29:58 664 1

原创 代码随想录算法训练营第二十一天 | LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、LeetCode236.二叉树的最近公共祖先

因为二叉搜索树是有序的,因此重复的元素必为相邻的元素,利用这一点,可以只需要一次遍历就求出出现最大的元素。非空,且pre的数值与cur的数值不同:说明前一个元素和当前元素不相等,count = 1。用双指针法,一个记录当前节点,一个记录当前节点的下一个节点,再用一个变量存最小值。非空,且pre的数值与cur的数值相同:说明该元素重复出现一次,count+1;【全局变量】定义一个count,初始化为0,统计单个元素出现的频率。为空,说明我们遍历的是第一个元素,count=1;

2024-04-09 13:02:44 887

原创 代码随想录算法训练营第二十天 |LeetCode654.最大二叉树、LeetCode617.合并二叉树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树

左:递归调用函数,传入当前节点的左孩子,用left接收返回值,如果返回值为false,那么直接向上返回false即可。我们在构造新的二叉树的时候,直接在其中一棵二叉树身上修改就行,不用再去定义新的二叉树。首先我们要知道二叉搜索树是一个有序树,左子树的值恒小于根节点,右子树的值恒大于根节点。右:递归调用函数,传入当前节点的右孩子,用right接收返回值,最后返回right。左:如果val小于二叉树的根节点,则向左子树递归,搜寻对应的值。右:如果val大于二叉树的根节点,则向右子树递归,搜寻对应的值。

2024-04-08 16:52:59 767

原创 代码随想录算法训练营第十八天 |LeetCode513.找树左下角的值、LeetCode112路径总和、LeetCode106从中序与后序构造二叉树

2.调用递归函数,判断函数的返回值,如果返回值是true,继续往上返回true;2.调用递归函数,判断函数的返回值,如果返回值是true,继续往上返回true;找到深度最大的节点,使用前中后序都可以,因为本题没有中节点的处理逻辑,保证优先左边搜索,只要我们求深度最大的节点,此时就是数最后一行最左边的值。计数器,用来记录路径上节点的和(计数器直接传入目标值,与路径上节点的值相减,最后判断是否为0即可)。2)判断当前记录的深度是否比当前记录的深度大,若大,则记录当前节点的深度和当前节点的值。

2024-04-06 15:31:39 547 1

原创 代码随想录算法训练营第十七天 |LeetCode110.平衡二叉树、LeetCode257.二叉树的所有路径、LeetCode404 .左叶子之和

巩固一下二叉树中高度和深度的概念。

2024-04-05 14:03:50 1606 1

原创 代码随想录算法训练营第十六天 |LeetCode104.二叉树的最大深度、LeetCode111.二叉树的最小深度、LeetCode完全二叉树的节点个数

之前用了层序遍历的模板,迭代法来做这道题,这次试试看递归法。

2024-04-04 09:35:07 516 1

空空如也

空空如也

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

TA关注的人

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