自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第四天(C) | ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II

大家在遇到无法定位头节点,头节点可能被移动删除导致定位失效的时候可以考虑用虚拟头节点,并不是每道题都要用的!题目强制要求交换结点,而不是交换数值;

2023-09-25 22:23:36 2099

原创 代码随想录算法训练营第三天(C) | ● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表

前言文章目录前言总结前言。

2023-09-23 21:47:13 2496

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

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。细心的录友会发现,我在 height数组上后,都加了一个元素0, 为什么这么做呢?

2023-09-23 19:46:02 252

原创 代码随想录算法训练营第59天 | ● 503.下一个更大元素II ● 42. 接雨水

为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。如果添加第二个5的时候就应该将第一个5的下标弹出,把第二个5添加到栈中。通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。答:不会,因为采用的单调栈是递增的,所以大的数值会在栈中被保留下去。

2023-09-22 16:27:15 196

原创 代码随想录算法训练营第二天(C) | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵

如果有负数的话感觉也不能用滑动窗口了,因为有负数的话无论你收缩还是扩张窗口,你里面的值的总和都可能增加或减少,就不像之前收缩一定变小,扩张一定变大,一切就变得不可控了。如果要 cover 所有的情况,那每次 left 都要缩到 right,那就退化为暴力了哈哈。滑动窗口实际上是双层遍历的优化版本,而双指针其实只有一层遍历,只不过是从头尾开始遍历的。可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是。这道题,我想用两头取值的双指针,结果错了?坚持循环不变量原则。

2023-09-21 16:31:09 2880

原创 代码随想录算法训练营第58天 | ● 739. 每日温度 ● 496.下一个更大元素 I

因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况。

2023-09-21 10:53:56 129

原创 代码随想录算法训练营第一天(C)| 704. 二分查找 27. 移除元素

java转C语言,进步很大,开心。前言总结。

2023-09-20 19:52:29 2807

原创 代码随想录算法训练营第57天 | ● 647. 回文子串 ● 516.最长回文子序列 ● 动态规划总结篇

其他情况dp[i][j]初始为0就行,这样递推公式:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);从递归公式中,可以看出,dp[i][j] 依赖于 dp[i + 1][j - 1] ,dp[i + 1][j] 和 dp[i][j - 1];那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;

2023-09-20 10:17:57 114

原创 代码随想录算法训练营第56天 | ● 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);

2023-09-19 09:17:17 176

原创 代码随想录算法训练营第55天 | ● 392.判断子序列 ● 115.不同的子序列

当s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

2023-09-18 19:02:58 64

原创 代码随想录算法训练营第53天 | ● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);但,事实上,dp数组表示的是。

2023-09-16 18:35:55 147

原创 代码随想录算法训练营第52天 | ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。所以默认习惯 从前向后遍历。但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;所以在遍历的时候顺便把dp[i][j]的最大值记录下来。

2023-09-15 19:15:55 142

原创 代码随想录算法训练营第51天 | ● 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]);即:dp[i][2] = dp[i - 1][0] + prices[i];

2023-09-14 10:25:44 127

原创 代码随想录算法训练营第50天 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

例如 dp[i][1] ,并不是说 第i天一定买入股票,有可能 第 i-1天 就买入了,那么 dp[i][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-09-13 11:06:13 101

原创 代码随想录算法训练营第49天 | ● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

由递推公式 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-09-12 15:43:48 89

原创 代码随想录算法训练营第48天 | ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);

2023-09-11 16:14:01 128

原创 代码随想录算法训练营第46天 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

从递推公式中可以看出,dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都都是false了。二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

2023-09-09 15:36:42 138

原创 代码随想录算法训练营第45天 | ● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数11

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。另外,例子中有重复,所以是排列,并且背包在前面;递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

2023-09-08 19:55:20 1236

原创 代码随想录算法训练营第44天 | ● 完全背包● 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]存在这样的一种选法。首先,其背包的遍历顺序是倒序,因为01背包只允许取一个,倘若是正序,对于dp[j] = dp[j-weigh[i]) + value[i] ,会重复取多次,不符合01背包的定义;而不会出现{5, 1}的情况。

2023-09-07 14:50:34 158

原创 代码随想录算法训练营第43天 | ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

其实 此时最终的dp[0] = 32,也就是这五个零 子集的所有组合情况,但此dp[0]非彼dp[0],dp[0]能算出32,其基础是因为dp[0] = 1 累加起来的。接下来就是如何初始化dp[j]呢,因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

2023-09-06 15:37:10 106

原创 代码随想录算法训练营第42天 | ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。第i件物品的重量是weight[i],得到的价值是value[i]。

2023-09-05 12:12:05 98

原创 代码随想录算法训练营第41天 | ● 343. 整数拆分 ● 96.不同的二叉搜索树

递推公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));所以递推公式:dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j});所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。因为在递推公式推导的过程中,每次计算dp[i],取最大的而已。

2023-09-04 19:54:34 74

原创 代码随想录算法训练营第39天 | ● 62.不同路径 ● 63. 不同路径II

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。

2023-09-02 11:12:50 316

原创 代码随想录算法训练营第38天 | ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

那么 dp[0] 应该是多少呢?根据dp数组的定义,到达第0台阶所花费的最小体力为dp[0],那么有同学可能想,那dp[0] 应该是 cost[0],例如 cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] 的话,dp[0] 就是 cost[0] 应该是1。看一下递归公式,dp[i]由dp[i - 1],dp[i - 2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]dp[1]推出。但总有点牵强的成分。

2023-09-01 16:51:50 305

原创 代码随想录算法训练营第37天 | ● 738.单调递增的数字 ● 968.监控二叉树 ● 总结

空节点不能是无覆盖的状态,这样叶子节点就要放摄像头了,空节点也不能是有摄像头的状态,这样叶子节点的父节点就没有必要放摄像头了,而是可以把摄像头放在叶子节点的爷爷节点上。// 左右节点都是无覆盖状态,那 根节点此时应该放一个摄像头, (0,0) (0,1) (0,2) (1,0) (2,0),状态值为 1,摄像头数 ++;// 左右节点的 状态为 (1,1) (1,2) (2,1) 也就是左右节点至少存在 1个摄像头,那么本节点就是处于被覆盖状态。本题的难点首先是要想到贪心的思路,然后就是遍历和状态推导。

2023-08-31 10:36:19 307

原创 代码随想录算法训练营第36天 | ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。此时前面出现过所有字母,最远也就到这个边界了。在遍历的过程中相当于是要找每一个字母的边界,

2023-08-30 11:32:42 93

原创 代码随想录算法训练营第35天 | ● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球

如果真实的模拟射气球的过程,应该射一个,气球数组就remove一个元素,这样最直观,毕竟气球被射了。但仔细思考一下就发现:如果把气球排序之后,从前到后遍历气球,被射过的气球仅仅跳过就行了,没有必要让气球数组remove气球,只要记录一下箭的数量就可以了。两个都试一下,发现:如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

2023-08-30 10:08:58 86

原创 代码随想录算法训练营第34天 | ● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

因为要按照绝对值从大到小排序,所以o2的绝对值大于o1的绝对值时,返回负值,否则返回正值。i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。那么又是一个贪心:局部最优:只找数值最小的正整数进行反转,当前数值和可以达到最大(例如正整数数组{5, 3, 1},反转1 得到-1 比 反转5得到的-5 大多了),全局最优:整个 数组和 达到最大。

2023-08-29 10:14:28 63

原创 代码随想录算法训练营第32天 | ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

一开始看到题目的思路是,找到一个在跳跃范围内最大的数,去加上他,一直循环,直到判断能否到达终点;所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。尝试解这个例子,发现了问题,因为是随着cover来进行循环的,每一次只考虑cover和i+nums[i]的哪个大,//判断两者的最大值。

2023-08-26 18:12:50 76

原创 代码随想录算法训练营第31天 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。提议没有绊住me,反到是 curDiff = num[i] - nums[i-1];在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果。

2023-08-25 19:26:35 66

原创 代码随想录算法训练营第30天 | ● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独

因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满当然好了,说明找到结果了),所以不需要终止条件!N皇后问题 是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。那么我们用皇后们的约束条件,来回溯搜索这棵树,

2023-08-24 11:28:24 92

原创 代码随想录算法训练营第29天 | * 491.递增子序列* 46.全排列* 47.全排列 II

大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。虽然和之前的90、子集(2)很像,但本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。为什么排列问题不用 startIndex。排列问题是回溯算法解决的经典题目,大家可以好好体会体会。需要used数组记录path里都放了哪些元素了。也行,那为什么还要写这个条件呢?这里可能大家又有疑惑,既然。

2023-08-23 18:45:56 84

原创 代码随想录算法训练营第28天 | ● 93.复原IP地址 ● 78.子集 ● 90.子集II

求排列问题的时候,就要从0开始,因为集合是有序的,{1, 2} 和{2, 1}是两个集合,排列问题我们后续的文章就会讲到的。其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。本题我们还需要一个变量pointNum,记录添加逗点的数量。如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,什么时候for可以从0开始呢?那么关于回溯算法中的去重问题,段位以0为开头的数字不合法。段位里有非正整数字符不合法。段位如果大于255了不合法。

2023-08-22 15:44:25 92

原创 代码随想录算法训练营第27天 | ● 39. 组合总和● 40.组合总和II● 131.分割回文串 第26天休息

然后看到下面提示:1

2023-08-22 10:52:38 74

原创 代码随想录算法训练营第25天 | ● 216.组合总和III● 17.电话号码的字母组合

本题就是在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合。而整个集合已经是固定的了[1,...,9]。两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来。其实本题不算难,但也处处是细节,输入1 * #按键等等异常情况。

2023-08-21 21:39:23 100

原创 代码随想录算法训练营第24天 | ● 理论基础 ● 77. 组合

是的,我指的是所有回溯法的问题都可以抽象为树形结构!再来看一下参数,因为回溯算法需要的参数可不像二叉树递归的时候那么容易一次性确定下来,,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。在回溯算法中,我的习惯是函数起名字为backtracking,这个起名大家随意。相当于只需要把达到叶子节点的结果收集起来,就可以求得 n个数中k个数的组合集合。子集问题:一个N个数的集合里有多少符合条件的子集。

2023-08-21 20:00:32 74

原创 代码随想录算法训练营第23天 | ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

直接想法就是:递归处理,然后遇到 的时候直接return NULL,一波修改,赶紧利落。然而[1, 3]区间在二叉搜索树的中可不是单纯的节点3和左孩子节点0就决定的,还要考虑节点0的右子树。因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。并不简单,需要理解。这里注意,我这里定义的是左闭右闭区间,在不断分割的过程中,也会坚持左闭右闭的区间,这又涉及到我们讲过的循环不变量:那么有序的元素如何求累加呢?其实这就是一棵树,大家可能看起来有点别

2023-08-21 09:39:07 88

原创 代码随想录算法训练营第22天 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。如果 从节点5继续向左遍历,那么将错过成为q的祖先, 如果从节点5继续向右遍历则错过成为p的祖先。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。

2023-08-20 22:28:42 47

原创 代码随想录算法训练营第21天 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中的众数 ● 236. 二叉树的最近公共祖先

前言文章目录前言总结前言遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。最直观的想法,就是把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。

2023-08-20 21:17:37 100

原创 代码随想录算法训练营第20天 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树 (第19天休息)

构造二叉树;一、654.最大二叉树注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。其实就是不同代码风格的实现,一般情况来说:如果让空节点(空指针)进入递归,就不加if,如果不让空节点进入递归,就加if限制一下, 终止条件也会相应的调整。if (rightIndex - leftIndex < 1) {// 没有元素了if (rightIndex - leftIndex == 1) {// 只有一个元素。

2023-08-19 19:51:17 37

空空如也

空空如也

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

TA关注的人

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