- 博客(56)
- 收藏
- 关注
原创 码随想录算法训练营第62天|卡码网:97. 小明逛公园、127. 骑士的攻击
思路:使用Floyd 算法,目的是解决多源最短路问题,即 求多个起点到多个终点的多条最短路径。用 grid数组来存图,那就把dp数组命名为 grid。grid[i][j][k] = m,表示 节点i 到 节点j 以[1…k] 集合为中间节点的最短距离为m。注意:[1…k] ,表示节点1 到 节点k 一共k个节点的集合。分两种情况:1.节点i 到 节点j 的最短路径经过节点k。
2024-10-06 00:33:14 1071
原创 码随想录算法训练营第61天|卡码网:94. 城市间货物运输 I、95. 城市间货物运输 II、96. 城市间货物运输 III
思路:只对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了,不需要对所有边进行松弛。基于以上思路,如何记录 上次松弛的时候更新过的节点呢?用队列来记录。(其实用栈也行,对元素顺序没有要求)针对:图中边的权值可以有负数,且不存在任何负权回路的情况。(可以为正权回路)
2024-09-29 00:32:10 665
原创 代码随想录算法训练营第59天|卡码网 47. 参加科学大会、94. 城市间货物运输 I
思路依然是 dijkstra 三部曲:1.第一步,选源点到哪个节点近且该节点未被访问过2.第二步,该最近节点被标记访问过3.第三步,更新非访问节点到源点的距离(即更新minDist数组)只不过之前是 通过遍历节点来遍历边,通过两层for循环来寻找距离源点最近节点。这次我们直接遍历边,且通过堆来对边进行排序,达到直接选择距离源点最近节点。1.针对稀疏图,从边的角度使用邻接表进行图存储。2.选源点到哪个节点近且该节点未被访问过。
2024-09-28 14:29:53 391
原创 代码随想录算法训练营第58天|卡码网 117. 软件构建、47. 参加科学大会
思路:使用BFSBFS的实现思路:拓扑排序的过程,其实就两步:1.找到入度为0 的节点,加入结果集2.将该节点从图中移除循环以上两步,直到 所有节点都在图中被移除了。结果集的顺序,就是我们想要的拓扑排序顺序 (结果集里顺序可能不唯一)
2024-09-22 14:36:05 580
原创 代码随想录算法训练营第57天|卡码网 53. 寻宝 prim算法精讲和kruskal算法精讲
prim算法 是从节点的角度 采用贪心的策略 每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。prim算法核心就是三步:1.第一步,选距离最小生成树最近节点2.第二步,最近节点加入生成树3.第三步,更新非生成树节点到生成树的距离(即更新minDist数组)其中:minDist数组 用来记录 每一个节点距离最小生成树的最近距离。
2024-09-17 16:40:17 371
原创 代码随想录算法训练营第56天|卡码网 108.冗余连接、109.冗余连接II
题目描述有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图:现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图:先请你找出冗余边,删除后,使该图可以重新变成一棵树。输入描述第一行包含一个整数 N,表示图的节点个数和边的个数。后续 N 行,每行包含两个整数 s 和 t,表示图中 s 和 t 之间有一条边。输出描述输出一条可以删除的边。
2024-09-17 10:43:35 1107
原创 代码随想录算法训练营第55天|卡码网 107. 寻找存在的路径
题目中各个点是双向图链接,那么判断 一个顶点到另一个顶点有没有有效路径其实就是看这两个顶点是否在同一个集合里。最后 isSame(int u, int v) 判断是否是同一个根 就可以了。使用 join(int u, int v)将每条边加入到并查集。如何算是同一个集合呢,有边连在一起,就算是一个集合。
2024-09-08 16:35:05 319
原创 代码随想录算法训练营第54天|卡码网 110. 字符串接龙、105.有向图的完全可达性、106.岛屿的周长
思路:本题只需要求出最短路径的长度就可以了,不用找出具体路径。
2024-09-08 12:03:02 551
原创 代码随想录算法训练营第52天|卡码网101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104.建造最大岛屿
思路:找到岛屿,检查是否是孤岛,统计面积。
2024-09-01 15:35:07 858 1
原创 代码随想录算法训练营第51天|卡码网99. 岛屿数量、100. 岛屿的最大面积
本题思路:遇到一个没有遍历过的节点陆地,计数器就加一,然后使用dfs或者bfs把该节点陆地所能遍历到的陆地都标记上。在遇到标记过的节点或遇到海洋节点的时候直接跳过。这样计数器就是最终岛屿的数量。bfs的写法:注意:只要加入队列,立即标记该节点被访问过。以上使用dfs或者bfs的目的都是:把该岛屿所能遍历到的陆地都标记上,不会统计到其他岛屿上。
2024-08-26 00:13:25 342
原创 代码随想录算法训练营第50天|卡码网 98. 所有可达路径
本题我们会有n 个节点,因为节点标号是从1开始的,为了节点标号和下标对齐,我们申请 (n + 1) *( n + 1) 这么大的二维数组。邻接矩阵是从节点的角度来表示图,有多少节点就申请多大的二维数组。还需要存一个n,表示终点,我们遍历的时候,用来判断当 x==n 时候 标明找到了终点。当目前遍历的节点 为 最后一个节点 n 的时候 就找到了一条 从出发点到终止点的路径。首先dfs函数一定要存一个图,用来遍历的,需要存一个目前我们遍历的节点,定义为x。接下来就是将选中的x所指向的节点,加入到 单一路径来。
2024-08-25 10:45:17 385
原创 代码随想录算法训练营第49天|LeetCode 42. 接雨水、84.柱状图中最大的矩形
思路:1.如果当前遍历的元素(柱子)高度小于栈顶元素的高度:就把这个元素加入栈中,因为栈里本来就要保持从小到大的顺序(从栈头到栈底);2.如果当前遍历的元素(柱子)高度等于栈顶元素的高度:要更新栈顶元素,因为遇到相相同高度的柱子,需要使用最右边的柱子来计算宽度。
2024-08-18 14:35:42 488
原创 代码随想录算法训练营第48天|LeetCode 739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II
思路:本题计算右边第一个大于当前温度的天数,因此使用单调栈,且是递增。
2024-08-17 15:40:07 381
原创 代码随想录算法训练营第47天|LeetCode 647. 回文子串、516.最长回文子序列
1. LeetCode 647. 回文子串题目链接:https://leetcode.cn/problems/palindromic-substrings/description/文章链接:https://programmercarl.com/0647.回文子串.html视频链接:https://www.bilibili.com/video/BV17G4y1y7z9/1.确定dp数组(dp table)以及下标的含义布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子
2024-08-11 14:28:47 599
原创 代码随想录算法训练营第45天|LeetCode 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
思路:1.确定dp数组(dp table)以及下标的含义dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]。2.确定递推公式3.dp数组如何初始化dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。即,dp[i][0]一定都是1;dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。即,dp[0][j]一定都是0;dp[0][0]应该是1。注意:当i或j为0时,子串是空字符串。
2024-08-10 21:05:33 704
原创 代码随想录算法训练营第44天|LeetCode 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
1.确定dp数组(dp table)以及下标的含义dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j]2.确定递推公式主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同。
2024-08-08 00:33:51 655
原创 代码随想录算法训练营第43天|LeetCode 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
思路:1.dp[i]的定义dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度2.递推公式位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。注意:这里前提是nums[i] > nums[j],只有这种情况,才能使用dp[j]+1,更新dp[i];也就是说,从0到i-1位置也存在nums[i] <= nums[j]的情况,这时就不考虑以该j位置结尾的最长子序列的长度了dp[j];3.初始化。
2024-08-04 15:38:15 652
原创 代码随想录算法训练营第42天|LeetCode 188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
思路:1.确定dp数组以及下标的含义使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]。总共2k+1个状态。2.确定递推公式j += 2) {j为奇数是买,偶数是卖的状态。3.dp数组如何初始化j < 2 * k;j += 2) {j为偶数是卖、奇数是买的状态。4.确定遍历顺序从递归公式其实已经可以看出,一定是从前向后遍历,因为dp[i],依靠dp[i - 1]的数值。
2024-08-04 00:10:48 1040
原创 代码随想录算法训练营第41天|LeetCode 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
dp[i][0] 表示第i天持有股票所得最多现金;dp[i][1] 表示第i天不持有股票所得最多现金。1️⃣如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0];第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);
2024-07-31 23:57:44 784
原创 代码随想录算法训练营第40天|LeetCode 198.打家劫舍、213.打家劫舍II、337.打家劫舍III
思路:递推公式:第j个房间偷还是不偷偷:dp[j-2]+nums[i]不偷:dp[j-1]
2024-07-29 00:39:38 396
原创 代码随想录算法训练营第38天|LeetCode 322. 零钱兑换、279.完全平方数、139.单词拆分
思路:硬币无限,即:完全背包求最少硬币个数,不是组合和排列物品:coins背包:总金额为amount的背包重量:金额价值:硬币个数注意:使用递推公式之前,必须确保dp[j - coins[i]]!= Integer.MAX_VALUE,否则就是在最大值的基础上加一。
2024-07-26 01:16:25 527
原创 代码随想录算法训练营第37天|LeetCode 518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
思路:硬币无限,即,完全背包物品:coins背包:总金额amount重量:硬币金额价值:组合数量本题关键:求方案个数,则递推公式如下:求组合,遍历顺序是先物品再背包;求排列,遍历顺序是先背包再物品。
2024-07-22 23:27:14 344
原创 代码随想录算法训练营第36天|LeetCode 1049. 最后一块石头的重量 II、494. 目标和、474.一和零
思路:01背包问题dp[N]里是容量为N的背包所能背的最大重量。将所有的石头分成两堆石头,一堆石头的总重量是dp[N],另一堆就是sum - dp[N]。在计算target的时候,N = sum / 2 因为是向下取整,所以sum - dp[N] 一定是大于等于dp[N]的。那么相撞之后剩下的最小石头重量就是 (sum - dp[N]) - dp[N]。
2024-07-21 15:22:43 558
原创 代码随想录算法训练营第35天|LeetCode 01背包问题 二维、01背包问题 一维、416. 分割等和子集
思路:01背包问题注意:1️⃣若当前背包的容量都没有当前物品i大的时候,是不放物品i的。那么前i-1个物品能放下的最大价值就是当前情况的最大价值;2️⃣若当前背包的容量可以放下物品i那么此时分两种情况:1、不放物品i2、放物品i比较这两种情况下,哪种背包中物品的最大价值最大。
2024-07-21 00:45:19 678
原创 代码随想录算法训练营第34天|LeetCode 62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树
初始化时,出现障碍物的地方以及之后的地方路径都是0.本题关键要考虑障碍物,出现障碍物的地方路径为0;
2024-07-18 00:15:42 413
原创 代码随想录算法训练营第33天|LeetCode 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
2. LeetCode 70. 爬楼梯3. LeetCode 746. 使用最小花费爬楼梯
2024-07-17 00:58:10 752
原创 代码随想录算法训练营第31天|LeetCode 56. 合并区间、738.单调递增的数字、968.监控二叉树
思路:本题关键是重叠后的右边界的确定,取最大的右边界,而不是最小右边界。
2024-07-15 00:13:54 304
原创 代码随想录算法训练营第30天|LeetCode 452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间
思路:解题关键:只需要比较当前气球起始位置与重叠气球的最小右边界即可,若大于,则说明需要新的一支箭射中当前气球;否则,当前气球仍然与重叠气球重叠,共用一只箭。首先按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。然后,贪心:局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。
2024-07-14 15:00:54 496
原创 代码随想录算法训练营第29天|LeetCode 134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
思路:贪心:局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。全局最优:找到可以跑一圈的起始位置。如果从起始位置i开始跑一圈的过程中不出现小于0的情况就说明该起始位置i可以跑一圈。若出现,则说明起始位置i到出现累加和小于0的位置j之间不存在合适的起始位置,新的起始位置从j+1开始。代码解析:有一个关键的变量,即:totalSum。用其判断整个数组有没有起始位置,若小于0,则表示没有起始位置;若大于0,则表示有起始位置。
2024-07-14 01:23:24 793
原创 代码随想录算法训练营第27天|LeetCode 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和
思路:本题关键是知道:利润拆分,即:把整体利润拆为每天的利润。假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!
2024-07-11 23:42:29 961
原创 代码随想录算法训练营第26天|LeetCode 455.分发饼干、376. 摆动序列、53. 最大子序和
思路:这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。
2024-07-10 21:54:02 325
原创 代码随想录算法训练营第25天|LeetCode 491.递增子序列、46.全排列、47.全排列 II
思路:本题的难点有如下:1.终止条件;2.如何去重;3.如何判断递增。1.终止条件:当获取到符合的列表后,需添加到结果集中,但不需要返回,因为还需要继续添加元素。2.如何去重:本题数组nums不能调整顺序,而且内部有重复元素,因此不能对其进行排序。故可以使用map对单层的元素使用情况进行标记,当出现重复元素时,只需要判断是否使用即可。3.如何判断递增:将当前的节点与list中最后的元素进行比较(也就是上一层添入的元素),若大于则添入list中,否则,跳过当前节点继续判断。
2024-07-07 16:40:15 349
原创 代码随想录算法训练营第24天|LeetCode 93.复原IP地址、78.子集、90.子集II
思路:其实与之前的分割回文串无异。需注意的是终止条件,由于IP地址是四个整数,因此存储字符串的list只要大小达到4就要返回,另外只有切割线等于字符串大小时,才会将最终字符串传入结果集中,否则仅仅是返回。IP无效有三种情况:1️⃣整数大于255;2️⃣含有前导03️⃣有非正整数字符其中:前导0(Leading Zero)是指在数字字符串中,位于。如果仅仅是一个字符串0,则不是前导0。
2024-07-07 00:36:55 347
原创 代码随想录算法训练营第23天|LeetCode 39. 组合总和、40.组合总和II、131.分割回文串
本题和77.组合 (opens new window)、216.组合总和III (opens new window)有两点不同:1.组合没有数量要求;2.元素可无限重复选取。无数量要求,则不能根据列表长度进行终止,需要根据sum>target进行终止;可重复取,则递归时不用startIndex加一。
2024-07-06 15:28:48 495
原创 代码随想录算法训练营第22天|LeetCode 77. 组合、216.组合总和III、17.电话号码的字母组合
思路:利用递归回溯的方式。递归回溯树形图如下:其中,每层代表该层递归的处理逻辑,深度是递归的层数。代码解析:单层处理完当前节点,要记得撤销当前节点,即回溯。这样它才能在当层排除该处理节点,并对其他节点重新进行处理,进行相同的逻辑。
2024-07-06 00:29:49 408
原创 代码随想录算法训练营第21天|LeetCode 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
思路:递归,利用二叉搜索树的性质,找到在区间内部的节点保留,并返回。与二叉搜索树节点删除不同之处树是:二叉搜索树节点删除是,利用性质,找到要删除的节点;修剪是,利用性质,找到要保留的节点。
2024-07-03 00:14:05 1204
原创 代码随想录算法训练营第20天|LeetCode 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。同时要利用二叉搜索树的性质,即,左小右大,有选择路径的寻找待删除节点,最终将左右节点的结果返回,赋给当前节点的左右节点上。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。当遇到空节点时,创建新的节点,并返回,作为上一节点的子节点。
2024-07-01 21:25:49 780
原创 代码随想录算法训练营第19天|LeetCode 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
使用中序遍历。因为二叉搜索树中序遍历是单调递增的,通过前后两个节点的差值与最小值进行比较,找出最终最小值。
2024-06-30 16:25:49 609
原创 代码随想录算法训练营第15天|LeetCode 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
思路:使用前序遍历递归构造二叉树。每次递归找出当前数组的位置范围中的最大值,作为当前节点对象,然后按照最大值位置切割数组,进行下一次递归,获取当前对象的左右节点对象。注意:1️⃣构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。2️⃣每次分隔不用定义新的数组,而是通过下标索引直接在原数组上操作。
2024-06-29 23:59:14 926
原创 代码随想录算法训练营第14天|LeetCode 513.找树左下角的值、路径总和、从中序与后序遍历序列构造二叉树
思路:使用递归或迭代都可以。由于是找最底层最左边的节点的值,即寻找最大深度的最左边叶子节点的值。使用递归方法时,每次记录当前深度,并尝试与最大深度进行比较。当是叶子节点,且深度大于最大深度时,更新最大深度,并将当前节点的值作为当前层的最左边的值。值得注意的是,当前层的其他叶子节点由于无法大于更新后的最大深度,就不能更新值。第一个更新最大深度的叶子节点也就是最左边的叶子节点。使用迭代法时,只需在每层i==0时更新值就可以。
2024-06-28 01:43:02 997
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人