- 博客(53)
- 收藏
- 关注
原创 代码随想录算法训练营第五十二天 | Bellman_ford 队列优化算法 bellman_ford之判断负权回路 bellman_ford之单源有限最短路
【代码】代码随想录算法训练营第五十二天 | Bellman_ford 队列优化算法 bellman_ford之判断负权回路 bellman_ford之单源有限最短路。
2025-12-27 17:09:31
97
原创 代码随想录算法训练营第五十一天 | dijkstra(堆优化版)Bellman_ford 算法
【代码】代码随想录算法训练营第五十一天 | dijkstra(堆优化版)Bellman_ford 算法。
2025-12-25 18:57:25
85
原创 代码随想录算法训练营第五十天 | 拓扑排序 dijkstra(朴素版)
【代码】代码随想录算法训练营第五十天 | 拓扑排序 dijkstra(朴素版)
2025-12-25 18:55:07
93
原创 代码随想录算法训练营第四十九天 | prim算法 kruskal算法
【代码】代码随想录算法训练营第四十九天 | prim算法 kruskal算法。
2025-12-25 18:50:23
84
原创 代码随想录算法训练营第四十八天 | 108. 冗余连接 109. 冗余连接II
【代码】代码随想录算法训练营第四十八天 | 108. 冗余连接 109. 冗余连接II。
2025-12-25 18:45:32
106
原创 代码随想录算法训练营第四十七天 | 并查集理论基础 107. 寻找存在的路径
【代码】代码随想录算法训练营第四十七天 | 107. 寻找存在的路径。
2025-12-25 18:41:32
89
原创 代码随想录算法训练营第四十六天 | 110. 字符串接龙 105.有向图的完全联通 106. 岛屿的周长
注意最后检查是否存在没访问过的结点时,要跳过visited[0]视频和文字的图 不是广搜过程的图,别看。周长是边,不是格子。
2025-12-15 18:24:51
171
原创 代码随想录算法训练营第四十五天 | 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104.建造最大岛屿
小细节:需要注意全是陆地的边界情况。(全是海洋无所谓,因为只要有海洋,就会走main中的统计逻辑)视频突然用 99.统计岛屿数量 的版本二写法了,我还是延用版本一写法。用别的数字来标记边岛,和孤岛的1区分开。不用visited的话,如何标记边岛?关键是:染不同颜色。
2025-12-15 14:27:34
61
原创 代码随想录算法训练营第四十四天 | 99.岛屿数量 深搜 99.岛屿数量 广搜 100. 岛屿的最大面积
如果节点出队列再标记为已访问过,会导致相同的节点重复入队列,进而导致队列中会有大量的重复节点。是:不管节点是否合法,上来就dfs,然后在终止条件的地方进行判断,不合法再return。是 :下一个节点是否能合法已经判断完了,传进dfs函数的就是合法节点。xy老让我联想到坐标,我就不用xy了。也可以叫row、col。我在之前回溯算法做过笔记,我更偏好版本一。
2025-12-12 22:34:11
162
原创 代码随想录算法训练营第四十一天 | 739. 每日温度 496.下一个更大元素 I 503.下一个更大元素II
视频栈口方向不舒服,我统一按栈口方向在右边。就不是视频说的递增栈,而是递减栈。(当然也没必要纠结概念)本题视频用的是map,保证了在O(1)内可以根据 num2值 找到nums1数组中对应的下标。所以用哈希来建立nums2和nums1的关系。虽然有些牵强,但是只要能提交通过不用纠结。写代码过程中要记得 栈中存放的是下标。当然数组也可以做到。
2025-12-09 20:37:36
189
原创 代码随想录算法训练营第四十天 | 647. 回文子串 516.最长回文子序列
当j=i+1时,dp[i+1][j-1] 虽然dp定义非法,但在二维数组中是存在的且为0。所以不用多加一个 j-i>1的判断。注意本题序列和上题数组,dp含义的不同。dp[i][j]含义:[i:j]注意由递推公式而来的遍历顺序。,最长回文子序列的长度。
2025-12-07 21:56:40
81
原创 代码随想录算法训练营第三十九天 | 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离
视频讲的递归公式考虑到了dp[i-1][j-1] = dp[i-2][j-2]+2 的第三种情况,并解释为何可以省略。其实dp含义思考清楚的话,递归公式根本不该有这种情况。还有一种巧妙解法是求lcs,return len(word1+word2)-2*lcs。类似于学习背包问题时,求最大价值和有多少种方案(做题的先后顺序变了而已)。这题和上一题相比,不仅仅变成了两个字符串都能删除,dp含义也改变了。s[i-1] == t[j-1]时,可以选择。
2025-12-07 16:49:34
211
原创 代码随想录算法训练营第三十八天 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
因为dp[i][j]含义:text1[0:i-1]中,和text2[0:j-1]中。所以dp[m][n]就是最大值。正确的dp[i][i]含义是:s[0:i-1]中,t[0:j-1]中,最长公共子序列的长度。dp[i][j]含义:text1[0:i-1]中,和text2[0:j-1]中,最长公共子序列的长度。视频和文字的dp含义完全错了,完全搞混了数组和序列的区别。问题是:子序列可以跳,所以“之前那个子序列”可能结束在任意位置。dp[i]含义:以 i 结尾的最大子数组(连续子序列)和。
2025-12-06 22:26:57
215
原创 代码随想录算法训练营第三十七天 | 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
【代码】代码随想录算法训练营第三十七天 | 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组。
2025-12-03 17:05:25
113
原创 代码随想录算法训练营第三十六天 | 188.买卖股票的最佳时机IV 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费
dp[1][0] = max(dp[0][0], dp[0][2]-prices[1], dp[0][3]-prices[1]),即可知道dp[0][2],dp[0][3]都应该初始化为0。视频讲的状态 dp[i][0] 是第一次持有之前不操作的状态,我都略过这个状态,直接从第一次持有的状态开始。因为 dp[i][0] 恒为0。视频讲的dp含义 和 dp含义的顺序 不好理解。dp[i][0]持有股票 的最大利润。dp[i][3]冷冻期后仍然未持有。dp[i][1]卖出股票。dp[i][2]冷冻期。
2025-12-03 14:15:33
149
原创 代码随想录算法训练营第三十五天 | 121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 123.买卖股票的最佳时机III
为什么dp[i][0] 不是= max(dp[i-1][0], dp[i-1][1]-prices[i])?最多只能两笔交易,要定义更多状态。
2025-12-02 17:15:36
110
原创 代码随想录算法训练营第三十四天 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
数组中dp[i]值 是 前几个元素的dp值 dp[i-1]和dp[i-2] ...的状态转移;二叉树中dpNode是子节点dpLeft和dpRight的状态转移,只不过dpNode是 有两个状态的数组。数组是每个元素(int类型)有两个状态;同理,二叉树是每个结点(struct类型)有两个状态。答案代码从1开始的,不用看了。
2025-12-01 19:47:11
184
原创 代码随想录算法训练营第三十三天 | 322. 零钱兑换 279.完全平方数 139.单词拆分
背包问题中 dp[j] 的含义都是装满容量为 j 的背包,所以如果装不满,dp[j]还是初始值。和答案代码最主要的差别就是遍历了物品(word)而不是s中的下标 i。本题 和 322. 零钱兑换 基本是一样的。无论排列还是组合,元素个数是一样的。
2025-12-01 18:31:24
137
原创 代码随想录算法训练营第三十二天 | 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ 70. 爬楼梯 (进阶)
但是从状态转移方程中显而易见,利用的是本层之前的dp值,所以必须要正序遍历背包,本层后面的数据才能收集到之前的值。而本题的遍历顺序和完全背包不太一样,是只能先遍历物品,不能先遍历背包。那么就是先把1加入计算,然后再把5加入计算,得到的方法数量只有{1, 5}这种情况。而不会出现{5, 1}的情况。纯完全背包求得装满背包的最大价值是多少,和凑成总和的元素有没有顺序没关系,即:有顺序也行,没有顺序也行!背包容量的每一个值,都是经过 1 和 5 的计算,包含了{1, 5} 和 {5, 1}两种情况。
2025-11-30 17:33:42
524
原创 代码随想录算法训练营第三十一天 | 1049. 最后一块石头的重量 II 494. 目标和 474.一和零
这题看文字,视频和文字的扩展部分是一样的,可以用来方便理解。dp[i][j]:从下标为 [0,i] 的物品里任意取,凑满容量为 j 的背包,有dp[i][j]种方法。dp[j-cap] 还没更新,不是上一层 dp,而是初始 dp → 无法组合物品。那一轮已经过去了,不会再用“更新后的 dp[2] = 3”来算一次。本题求的是物品的个数,也就是把 +value[i] 换成 +1。原本的01背包dp[j]是容量为 j。还没被当前物品覆盖,仍然是“上一轮的状态”。因为我们是要用的其实是“上一行。
2025-11-28 23:31:41
610
原创 代码随想录算法训练营第三十天 | 01背包问题 二维 01背包问题 一维 416. 分割等和子集
dp[i][j] 表示从下标为 [0,i] 的物品里任意取,放进容量为j的背包,最大的价值。dp[j-w] 还没更新,不是上一层 dp,而是初始 dp → 无法组合物品。那一轮已经过去了,不会再用“更新后的 dp[2] = 3”来算一次。一维的视频和文字没说明白为什么要倒序背包和遍历顺序。01背包的应用:weight和value是相同的。还没被当前物品覆盖,仍然是“上一轮的状态”。一共两个状态:不放物品i;其中状态转移方程,是为了避免下标越界。因为我们是要用的其实是“上一行。
2025-11-26 17:35:28
188
原创 代码随想录算法训练营第二十九天 | 62.不同路径 63. 不同路径 II 343. 整数拆分 96.不同的二叉搜索树
dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。dp[i] : 1到 i 为节点组成的二叉搜索树的个数。dp[i]:拆分数字i,最大乘积为dp[i]。
2025-11-25 18:34:22
206
原创 代码随想录算法训练营第二十八天 | 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
dp[0]是没有意义的,只是为了dp[2]=2才初始dp[0]为1。所以为了避开dp[0],也可以下标从3开始。当前状态只依赖于前面两个状态,可以压缩。
2025-11-25 16:27:37
89
原创 代码随想录算法训练营第二十七天 | 56. 合并区间 738.单调递增的数字 968.监控二叉树
又如果递归出口既有叶子结点和空结点返回,那还不如直接只有空结点返回,因为两个空结点可以返回给叶子结点正确的状态。如果递归出口是遍历到叶子结点返回而不是空结点返回,也会在单层递归逻辑(左右) 补上对于空结点的默认值,例如这样。视频中的思路很好:res用来存放上一个合并区间,每次符合要求,就改res中最后一个区间。我上面第一遍的代码 if判断条件是不对的,既然res用来存放上一个合并区间,当然是。合并区间时,只需更新右边界,因为左边界已经排序了,必然是最小的。不能和之前区间重叠的题目一样,直接和。
2025-11-24 19:03:13
185
原创 代码随想录算法训练营第二十六天 | 452. 用最少数量的箭引爆气球 435. 无重叠区间 763.划分字母区间
for range string迭代输出的value是rune类型。
2025-11-23 16:54:29
94
原创 代码随想录算法训练营第二十五天 | 134. 加油站 135. 分发糖果 860.柠檬水找零 406.根据身高重建队列
如果先确定k,以k从小到大排序,会发现关于k的排列并不符合题目条件,身高h也无序,两个维度哪一个都没确定下来。每次curSum(累加油量)<0了,就将下一个元素i+1作为起点,为什么起点不选(0,i]呢?easy,局部最优显然是bill==20时,先找零一张10r和一张5r。我这种理解方式还能反证 视频和答案中 区间1的curSum不可能<0。,虽然实现了原地插入,但是不好想,可读性差,可以不用理解。先确定一边,再确定另一边,为了都满足,取最大值。
2025-11-23 15:47:43
328
原创 代码随想录算法训练营第二十四天 | 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和
我的代码和视频/答案中的标准代码不同,标准代码是从第0步开始跳,第0步的nextCover自然在遍历数组下标中更新为第1步的覆盖范围0+nums[0]。多次买卖该股票,那么[1,5,9] 第一天买入第三天卖出 和第一天买入第二天卖出+第二天买入第三天卖出是完全一样的。思路是: 移动下标达到了当前覆盖的最远距离&&下标不够最后一个元素时,步数就要+1,来增加覆盖距离。不纠结于能跳几步,只看覆盖范围。用于 根据自定义比较逻辑对。
2025-11-21 16:02:39
474
原创 代码随想录算法训练营第二十三天 | 455.分发饼干 376. 摆动序列 53. 最大子序和
上下坡有平坡的情况不单单指上下坡中间有平坡,还包括了先上(下)后平,先平后上(下),所有情况都是保留了平坡中最后一个元素。当连续和遇到负数,选择下一个元素作为起始位置。变成 (左边是凸,右边是凹)res也可以初始为nums[0]大饼干优先,先满足胃口大的。
2025-11-20 18:22:54
322
原创 代码随想录算法训练营第二十二天 | 491.递增子序列 46.全排列 47.全排列 II
排序问题本身不需要startIdx,但是需要used来确保遍历到每个结点的时候,排除掉祖先结点已经取的数值,也就是nums中的同一个下标对应的值不取两遍。eg: nums = [1,1,2]中第一个1不取两遍。40.组合总和II 去重逻辑 和 46.全排列 的结合。(本题递归出口可以省略,为了代码健壮性就保留了)代码中两个if 体现了这两个作用。排列不需要startIdx。
2025-11-19 17:34:36
196
原创 代码随想录算法训练营第二十一天 | 93.复原IP地址 78.子集 90.子集II
func strings.Join(elems []string, sep string) string,因为使用Join,path定义为string切片。法2相当于比法1多递归了一层,但是不用在出口判断合法,更好理解。40.组合总和II 和 78.子集的结合。
2025-11-18 23:26:10
115
原创 代码随想录算法训练营第二十天 | 39. 组合总和 40.组合总和II 131.分割回文串
所以我下面的代码不必排序,只是画图元素从小到大,顺手加上排序了。用used数组来判断是树层还是树枝,树枝不去重。返回的也是一个新的字符串。
2025-11-16 20:33:54
214
原创 代码随想录算法训练营第十九天 | 开始回溯章节 77. 组合 216.组合总和III 17.电话号码的字母组合
答案用[]byte收集每个结点的值,我用string收集每个结点值。好处是不用定义tmp切片再copy了,因为append都是值传递,但切片的值传递,切片底层指向的都是同一个数组。每次叶子结点(即递归出口)的path要把值copy到新定义的切片tmp中,否则res将全是最后一个叶子结点(即递归出口)的path。因为path切片指向的底层数组是不变的。视频中隐藏回溯讲的是第二层到第三层的回溯,没问题,但我觉得直接用第一层到第二层理解更好。
2025-11-14 15:17:54
176
原创 代码随想录算法训练营第十八天 | 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
终止条件很有意思,终止条件中也有递归:返回当前删除结点的右(左)子树(修剪好的)给父结点。让单层递归来接收递归出口的返回值。二叉搜索树中序遍历是有序数组,那么我们反过来右中左遍历就是倒序数组。
2025-11-13 18:06:15
97
原创 代码随想录算法训练营第十七天 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
视频是在递归出口处删除结点。我感觉也可以这么理解:中左右的单路径往下遍历。精简后的答案代码很好理解,没必要写的冗余。easy,递归法省略。
2025-11-11 18:10:32
171
原创 代码随想录算法训练营第十六天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
easy一般的思路是遍历一遍二叉树,找出最大频率(maxCount),然后再重新遍历一遍二叉树把出现频率为maxCount的元素放进res。但其实能够只遍历一遍就找到众数的集合: 情况1:p,q不是对方的祖先 情况2:p,q是对方的祖先代码是按情况1写的,但是也包含了情况2:因为当遍历到祖先p/q的时候,触发了递归出口提前了,会将该祖先一路返回到根结点。第一时间确实想不到视频的方法,我的方法中递归函数的含义是判断node子树是否含有p || q,在外面定义一个变量,当同时含
2025-11-10 22:57:52
318
原创 代码随想录算法训练营第十五天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
math.MinInt是按当前机器的架构:-2^63。比题目给的node.val是math.MinInt32最小值还小,就可以用来判断第一个结点。答案代码的意思是每个结点有两个变量min和max来维持自己val的范围,左右子树要由父节点传递边界条件,所以顺序是前序遍历。递归终止条件是if len(nums)==1,对应的左右子树要加if判断来保证子切片长度>=1。
2025-11-10 17:10:58
280
原创 代码随想录算法训练营第十四天 | 513.找树左下角的值 112. 路径总和,113. 路径总和ii 106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树
我觉得从思路和代码来说,我的做法更好。(我的思路正好与递归法精简版差不多,不同的是答案中结点处理逻辑在递归出口之间,就可以判断targetSum == 0了)对于左右子树的定义和遍历顺序,我的做法和视频不同:我是前序遍历,targetSum减去中结点的值,最后找到叶子结点值正好等于一路减下来的剩余值。重点是切割左中序数组、右中序数组;左后序数组、右后序数组。没有apped,copy扩缩容,放心用切片当参数。
2025-11-08 21:12:25
498
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅