- 博客(54)
- 收藏
- 关注
原创 代码随想录算法训练营 Day61 图论ⅩⅠ Floyd A※ 最短路径算法
我们来看初始化,我们是把 k =0 的 i 和j 对应的数值都初始化了,这样才能去计算 k = 1 的时候 i 和 j 对应的数值。是不是 要选一个最小的,毕竟是求最短路。节点1 到节点5的最短距离是不是可以有节点1 到节点3的最短距离 + 节点3 到节点5 的最短距离组成呢?那节点1 到节点9 的最短距离是不是可以由节点1 到节点5的最短距离 + 节点5到节点9的最短距离组成呢?节点k 到 节点j 的最短距离也是不经过节点k,中间节点集合。如果节点i 到 节点j的最短距离 不经过节点k,中间节点集合。
2025-05-30 22:01:28
1974
原创 代码随想录算法训练营 Day60 图论Ⅹ Bellmen_ford 系列算法
边:节点2 -> 节点4,权值为1 ,minDist[4] > minDist[2] + (-3) ,更新 minDist[4] = minDist[2] + (-3) = 1 + (-3) = -2。,从队列中取出节点6,松弛节点6 作为出发点连接的边。本图中,对所有边进行松弛,真正有效的松弛,只有松弛边(节点1->节点2) 和边(节点1->节点3) 因此只要记录上一次松驰过的边即可。从队列中取出节点4,松弛节点4作为出发点连接的边(节点4 -> 节点6)边:节点4 -> 节点6,权值为4 ,
2025-05-30 18:16:27
1055
原创 代码随想录算法训练营 Day59 图论Ⅸ dijkstra优化版 bellman_ford
那对所有边松弛三次 可以得到与起点 三条边相连的节点的最短距离,这个时候,我们就能得到到达节点3真正的最短距离,也就是 节点1 -> 节点2 -> 节点5 -> 节点3 这条路线。其实也同时计算出了,起点到达所有节点的最短距离,因为所有节点与起点连接的边数最多也就是 n-1 条边。1. 第一步,选择原点到节点最近且未访问过的边,pair<节点编号,源点到该节点的权值>与起点(节点1)一条边相邻的节点,到达节点2 最短距离是 1,到达节点3 最短距离是5。边:节点5 -> 节点6,权值为-2 ,
2025-05-29 22:30:23
1861
原创 代码随想录算法训练营 Day58 图论Ⅷ 拓扑排序 Dijkstra
再强调一下 minDist[2] 的含义,它表示源点到节点2的最短距离,那么目前我们得到了源点到节点2的最短距离为1,小于默认值max,所以更新。(图中,max 表示默认值,节点0 不做处理,统一从下标1 开始计算,这样下标和节点数值统一,方便大家理解,避免搞混)- 源点到节点2的最短距离为1,小于原minDist[2]的数值max,更新minDist[2] = 1。1、选源点到哪个节点近且该节点未被访问过,源点距离源点最近,距离为0,且未被访问。这个图,我们只能将入度为0 的节点0 接入结果集。
2025-05-27 15:40:42
911
原创 代码随想录算法训练营 Day56 图论Ⅶ 最小生成树算法 Prim Kruskal
选择距离最小生成树最近的节点,加入到最小生成树,刚开始还没有最小生成树,所以随便选一个节点加入就好(因为每一个节点一定会在最小生成树里,所以随便选一个就好),那我们选择节点1(符合遍历数组的习惯,第一个遍历的也是节点1)Kruskal 与 prim 的关键区别在于,prim维护的是节点的集合,而 Kruskal 维护的是边的集合。排序后的边顺序为[(1,2) (4,5) (1,3) (2,6) (3,4) (6,7) (5,7) (1,5) (3,2) (2,4) (5,6)]
2025-05-27 14:36:08
1103
原创 代码随想录算法训练营 Day55 图论Ⅵ 并查集Ⅱ 冗余链接
前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案。树除了根节点只有一个入度,因此如果有两个入度说明有多余边,有三种情况讨论。1. 如果我们找到入度为2的点,那么删一条指向该节点的边就行了。如果某一条边的两个点同时存在在一个集合中说明图中存在环了,需要删除。树的一个特点就是他的根只能有一个,因此一条分支就属于一个集合。确定图中一定有了有向环,那么要找到需要删除的那条边。3. 如果没有入度为2的点,说明图中有环了。
2025-05-25 23:22:22
337
原创 代码随想录算法训练营 Day54 图论Ⅴ 并查集Ⅰ 寻找路径
首先要知道并查集可以解决什么问题呢?并查集常用来解决连通性问题。大白话就是当我们需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集。
2025-05-25 22:10:24
266
原创 代码随想录算法训练营 Day53 图论Ⅳ 字符串接龙 有向图 岛屿周长
思路就是构造有向图,然后遍历图标记节点为 vis 为 true,最后遍历节节点,全为 true 则说明可访问。对原始的字符串逐个位进行替换,匹配是否出现在 list 中,出现了就记录到 map 中,直到找到字符。岛屿周长不需要 DFS or BFS 只需要判断当前岛的四周如果是海洋或者是边界 +1 即可。给出开始与结束的字符串,给出字符串 list,返回从字符串开始到结束过程中最短的路径。有向图的连通性判断,判断 1 是否可以到达所有节点。因为广搜就是以起点中心向四周扩散的搜索。
2025-05-25 18:09:02
522
原创 代码随想录算法训练营 Day52 图论Ⅲ 岛屿问题Ⅱ 面积 孤岛 水流 造岛
+i) 这样从边框遍历,并记录遍历结果,最后 vis 就是我们访问过的非孤岛。计算孤岛总面积,一个想法是将相邻的陆地的位置置为 0,最后计算孤岛面积中最小的一个。题目是问:有没有一个节点可以让水流流到第一边界与第二边界,如果有输出这个节点的坐标。而且实际代码中流水是一条路径,遍历当前边的其他节点遇见了之前的路径就可以跳过了。1. 对岛屿遍历记录岛屿的编号与面积的关系,使用 unordermap。这样就只用遍历四个边的内容而不用遍历到里面的内容,减少了计算量。
2025-05-20 19:33:10
562
原创 代码随想录算法训练营 Day51 图论Ⅱ岛屿问题Ⅰ
并且陆地没有被访问,在这个陆地的基础上进行 DFS 方法,或者是 BFS 方法。[[Day51 图论Ⅱ岛屿问题Ⅰ-250519-1.png|500]]深度优先 B广度优先在函数外初始化记录,深度优先 A 在函数内初始化记录。2. 对陆地进行 DFS 的时候时刻注意以访问的元素添加访问标记。岛屿最大面积,给出广度优先搜索,深度优先搜索(A 和 B)广度优先搜索保证入队列的时候就对数据做标记为访问。主函数部分不变,调用变成广度优先搜索。1. 遍历图,若遍历到了陆地。使用广度优先搜索方法。
2025-05-19 17:19:56
603
原创 代码随想录算法训练营 Day49 图论Ⅰ 深度优先与广度优先
[[0-2 基础数据结构Ⅲ 图及其概念-250518-1.png]]V2V1。
2025-05-18 22:48:56
2108
原创 代码随想录算法训练营 Day48 单调栈Ⅱ 接雨水Like
使用单调递减单调栈实现,求左边比当前柱子小的 left,中间柱子 mid,右边比当前柱子小的 right。当数据大于栈口时找到了比当前元素右侧大的第一个元素,此时栈口的下一个元素时左侧大的元素。纵向求解,只关注当前柱子的左高度与右高度,因此创建数组关注当前位置的左最大值与右最大值。单调栈解题,因为单调栈适合寻找一侧第一大的元素,我们使用递增栈实现,横向求解。使用单调栈求解柱子中左边比当前柱子矮的,右边比当前柱子矮的,求解最小值。面积为当前元素的高度乘以这个元素坐标和右边最小元素的宽度。
2025-05-16 10:46:45
349
原创 代码随想录算法训练营 Day47 单调栈Ⅰ 每日温度Like
单调栈适合求当前元素左边或右边第一个比当前元素大或小的元素,找到元素进而确定数值下标等操作单调栈指的是:栈内的元素是递增或递减的(从栈口到栈底),单调排列栈内从栈口到栈底:求当前元素后面比他大的元素,遇到更大的元素就弹出之前的元素只收留更小的元素,保证递增栈内从栈口到栈底:求当前元素后比他小的元素只收留更大的元素,保证递减单调栈作用:存放遍历的元素。
2025-05-15 10:39:49
286
原创 代码随想录算法训练营 Day46 动态规划ⅩⅢ 回文字符串
动规五部曲里,哪一部没想清楚,这道题目基本就做不出来,即使做出来了也没有想清楚,而是朦朦胧胧的就把题目过了。
2025-05-14 10:28:08
1037
原创 代码随想录算法训练营 Day45 动态规划 ⅩⅡ 距离编辑Like
子序列判断编辑距离问题,本体的本质就是求 s 与 t 的最长公共子序列,只不过这个 s 不可删除1.dp[i][j]表示i-1, j-1为结尾的 s/t 字符串的最长公共子序列的长度2. 递推公式类似求最长公共子序列固定 s 不变,只删除 t(dp[i][j-1]不同子序列多少种删除 s 的方式让其变成 t1. 定义二维 dp 数组,2. 递推公式,考虑的是删除 s 使得变成 t,因此 t 不需要动,只考虑 s 的情况 (刚好匹配与-1 匹配)不考虑s[j-1]的元素。
2025-05-13 11:14:55
501
原创 代码随想录算法训练营 Day44 动态规划 ⅩⅠ 子序列问题
编辑距离问题,本体的本质就是求 s 与 t 的最长公共子序列,只不过这个 s 不可删除。其中 0-1 时候结果为 0 意思是字符串与空字符查找那最大的公共子序列结果为 0。2. 递推公式:基于之前的结果与当前结果的最大值作为当前 i 的 dp 值。本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!3. 初始化 dp,由于 dp 是从前往后推导,且定义为。表示以 i-1 与 j-1 结尾的最长公共子序列的长度。为结尾的 s/t 字符串的最长公共子序列的长度。结尾的最长公共子序列长度。
2025-05-12 10:00:13
359
原创 代码随想录算法训练营 Day42 动态规划Ⅹ 子序列问题
I-1 j-1 结尾方便代码书写,如果以 ij 结尾写需要在初始化的时候就寻找匹配项。2. 题目是连续子序列,因此只比较之前的子序列是否小于当前序列,若小于+1。2. 递增子序列,因此需要遍历当前以及以前长度的序列,因为是遍历每一个。无意义,因为 dp 定义是以 i-1 为结尾的 0-1 就是负数了。表示以 i-1 结尾的,以 j-1 结尾的最长重复子数组的长度。结果选择 dp 数组内最大的值表示当前 i 结尾最长递增子序列。,发现两个数组相同时,两个数组要同时退一格在这个基础上+1。
2025-05-10 11:05:09
477
原创 代码随想录算法训练营 Day41 动态规划Ⅸ 股票问题 续集
买卖股票最佳时机 1:1.dp[i][0]表示持有股票的最大金额,dp[i][1]表示不持有股票的最大金额,表示盈利结果2. 递推公式由前一天持有金额和是否买股票决定决定是否花钱买入股票股票最大盈利买卖股票最佳时机 2 买股票之前的钱是从不持有股票得来1. Dp 数组定义如上题,dp[i][0]表示持有股票最大金额,dp[i][1]表示不持有股票的最大金额2. 递推公式的确定类似上题,本题中可以多次买卖股票了,因此持有股票的最大金额是多次变换的。
2025-05-09 22:16:40
1000
原创 代码随想录算法训练营 Day40 动态规划Ⅷ 股票问题
2. 递推公式的确定类似上题,本题中可以多次买卖股票了,因此持有股票的最大金额是多次变换的。有贪心算法与 dp 两种,贪心算法就是吃干净每个 T,有波动就吃,波动小于 0 不操作。本题目说了只能持有或卖出两个状态,不存在持有卖一半的情况,因此持有之前一定是不持有的。结果最后只存在 2 4 中,因为卖出的金额一定比买入金额高,取两次卖出的最大值。基于上一题的升级版,有两次买卖机会,可以买卖一次,卖两次,不买卖。表示不持有股票的最大金额,表示盈利结果。持有的最大金额:取持有或者新买入的最大。
2025-05-08 14:09:27
442
原创 代码随想录算法训练营 Day39 动态规划Ⅶ 打家劫舍
成环问题解决,1. 去掉头尾链接看作线性数组解决,2. 考虑首元素不考虑尾元素,3. 只考虑尾元素。如果当前房价偷了,前一个不能偷,如果当前房价没偷,可以考虑偷不偷之前房。3. 二叉树的单层递归逻辑:按照后序遍历,将结果从叶子往根传递。表示不偷当前节点与偷当前节点,规定 0 表示不偷 1 表示偷。D. 遍历顺序跟随树的后序遍历(将结果逐个返回上一个节点),表示 dp 时打劫前 i 房子最大金币,前一个房子是。DP 流程推导,从叶子结点开始,如果给出两个 res。res 1 偷当前节点,那就取子节点不偷。
2025-05-07 11:59:43
355
原创 代码随想录算法训练营 Day38 动态规划Ⅵ 完全背包应用 多重背包
在讲解背包问题的时候,我们都是按照如下五部来逐步分析,相信大家也体会到,把这五部都搞透了,算是对动规来理解深入了。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组其实这五部里哪一步都很关键,但确定递推公式和确定遍历顺序都具有规律性和代表性,所以下面我从这两点来对背包问题做一做总结动态规划:416.分割等和子集(opens new window)动态规划:1049.最后一块石头的重量 II(opens new window)
2025-05-06 14:52:43
594
原创 代码随想录算法训练营 Day37 动态规划Ⅴ 完全背包 零钱兑换
纯的完全背包问题(只是背包)可以颠倒两次 for 循环的顺序因为完全背包 dp 值由左边的状态推导而来的,两种遍历方法都能保证前面有数据0-1 背包二维递推公式完全背包二维递推公式在于01背包是,完全背包是主要原因就是。
2025-05-05 15:24:43
416
原创 代码随想录算法训练营 Day36 动态规划Ⅳ 0-1背包应用 最大价值 是否装满 能装多少 有多少种装的方法 最多装多少
纯 0 - 1 背包 (opens new window)是求 给定背包容量 装满背包 的最大价值是多少。416. 分割等和子集 (opens new window)是求 给定背包容量,能不能装满这个背包。1049. 最后一块石头的重量 II (opens new window)是求 给定背包容量,尽可能装,最多能装多少494. 目标和 (opens new window)是求 给定背包容量,装满背包有多少种方法。474. 一和零 - 力扣(LeetCode)
2025-05-01 11:41:27
309
原创 代码随想录算法训练营 Day35 动态规划Ⅲ 0-1背包问题
Dp 说明dp[i][j]在[0,i]物品种类种任取放一个物品进容量为 J 背包里所能取到的最大价值总和。
2025-04-29 15:23:59
812
原创 代码随想录算法训练营 Day34 动态规划Ⅱ 路径
因此递推公式为 dp[i][j]=dp[i-1][j]+dp[i][j-1]表示两个方向上的路径。2. 递推公式类似上一题,但是要新增判定条件,当没有障碍的时候才递推,否则就为 0。4. 变量顺序从左往右上往下遍历,初始化数值是从上到下进行初始化的。3. 初始化上边与左边时,遇到障碍之后的路为 0 表示走不过去。1. Dp 数组表示从 00 到 ij 有多少种不同路径。3. 机器人只能向右或向下走,因此初始化要对上与左初始化。1. Dp 数组表示从 00 到 ij 有多少种不同路径。初始化为两边均为 1。
2025-04-28 11:43:54
364
原创 代码随想录算法训练营 Day32 动态规划Ⅰ 基础 爬楼梯
然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。
2025-04-26 12:14:58
614
原创 代码随想录算法训练营 Day29 贪心Ⅲ 加油站 糖果 找零 重建队列
场景分析 1 5 元收下 2 10 元找零 5 元 3 20 找零 10 5 元,遇到 20 优先消耗 10。可以用两个数组盛放数据,然后求最大值即可,或者第一遍记录,第二遍判断取最大。计算累加油量,当累加油量出现负数,说明之前任何地方都不够,开启新的位置。先确定一边情况,再确定另一边情况,右边情况需要逆顺序遍历。按照身高排序,然后根据数据 k 对身高部分进行插入。类似于发糖果,两种顺序处理左右情况,分析题目按照逻辑解决即可。
2025-04-23 03:09:01
206
原创 代码随想录算法训练营 Day28 贪心Ⅱ 股票交易 跳跃游戏 K取反
类似于上一道题目摆动序列,每天差值计算出来,总利润只要当前总和大于 0 的,否则不如卖出。两次贪心思路,找绝对值最大的负数取反,取最小数进行取反将影响降到最低。控制覆盖范围,局部最优是尽可能取覆盖范围,全局最优得到覆盖范围即可。列出每天的利润,只收集正利润。
2025-04-22 10:28:58
227
原创 代码随想录算法训练营 Day27 贪心Ⅰ 分饼干 摆动序列 最大子序列和
贪心算法。例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。再举一个例子如果是有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。
2025-04-21 10:06:38
459
原创 代码随想录算法训练营 Day25 回溯Ⅴ 子序列 全排列
代码随想录回溯本质就是暴力搜索,通过递归控制嵌套 for 循环数量。数据的处理可以看作树的处理,for 循环表示横向遍历,递归表示深层遍历组合:使用 startIdx 控制防止重复分支排列:使用 used 控制防止复用。
2025-04-19 11:22:44
432
原创 代码随想录算法训练营 Day24 回溯Ⅲ 分割 子集
类似于上一题分割,想明白细节,判定满足方法、分割方法等。在节点中收获结果,因此收获节点的时候直接收获。
2025-04-18 02:26:09
263
原创 代码随想录算法训练营 Day17 二叉树Ⅴ 搜索 合并
构建与搜索二叉树构造二叉树需要前序遍历,中左右构建,先构建中遇到搜索树,一定想着中序遍历,这样才能利用上特性。
2025-04-11 10:52:31
206
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人