- 博客(53)
- 收藏
- 关注
原创 【Day53 LeetCode】图论问题
之前提到的dijkstra算法和Bellman算法都是只能有一个起点,而这题是求多个起点到多个终点的多条最短路径。Floyd算法的思想是动态规划。dp数组,grid[i][j][k] = m,表示 节点i 到 节点j 以[1…k] 集合中的一个节点为中间节点的最短距离为m。dp方程,节点i 到 节点j 的最短路径是否经过节点k。若经过,grid[i][j][k] = grid[i][k][k - 1] + grid[k][j][k - 1];
2025-03-01 10:04:41
297
原创 【Day52 LeetCode】图论问题 Ⅹ
这题是并查集的应用,当边的两个节点已经出现在同一个集合里,说明边的两个节点已经连在一起了,再加入这条边一定就出现环了。
2025-02-28 21:24:38
163
原创 【Day51 LeetCode】图论问题 Ⅸ
Bellman_ford 算法 每次都是对所有边进行松弛,有一些重复的工作,只需要对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛就够了。所以,我们需要记录上一次更新的节点。
2025-02-28 20:58:53
155
原创 【Day49 LeetCode】图论问题 Ⅶ
主要实现了三个功能:1、寻找根节点,函数:find(int u),也就是判断这个节点的祖先节点是哪个;2、将两个节点接入到同一个集合,函数:join(int u, int v),将两个节点连在同一个根节点上;3、判断两个节点是否在同一个集合,函数:isSame(int u, int v),就是判断两个节点是不是同一个根节点。这题是判断一个顶点到另一个顶点有没有有效路径,换句话说,就是判断这两个顶点是否在同一个集合里。并查集能解决这类问题。
2025-02-26 22:11:29
359
原创 【Day48 LeetCode】图论问题 Ⅵ
拓扑排序是将一个有向图转成线性的排序,需要判断有向图中是否存在环。这个比较经典的问题就是leetcode里。和这题异曲同工。。优先选出入度为0的节点,因为入度为0表示不需要前置依赖(或者前置依赖已满足)。入度为0的节点进入队列,再出队列,消除对下一个节点的影响,也就是将下一个节点的入度减1,若产生新的入度为0的节点,则加入队列。
2025-02-26 15:39:17
452
原创 【Day47 LeetCode】图论问题 Ⅴ
今天学习最小生成树算法–prim算法和kruskal算法。最小生成树是所有节点的最小连通子图,有n个节点则必有n-1条边将所有节点连接起来。如何选取n-1条边使得图中所有节点连接到一起,并且边的权值和最小,这就是最小生成树问题。
2025-02-26 11:31:57
513
原创 【Day44 LeetCode】图论问题 Ⅱ
本质上还是要搜索所有岛屿,同时还得统计岛屿面积,将是孤岛的面积累加。这就涉及到不是孤岛的判断,遇到边界就不是孤岛,这个不要加入结果,我们只需要。,从而保证不是孤岛的返回值是负数就好,最后结果只累加正数。这个能在之前的代码下做出最小的改动。
2025-02-19 13:32:25
354
原创 【Day 43 LeetCode】图论问题 Ⅰ
关于图论有关的基本概念可以先看图论相关问题需要掌握最基础也是最关键的就是 图的遍历方法。有深度优先遍历和广度优先遍历两种方式。深度优先搜索代码实现就是采用递归,递归就涉及到三要素:参数、终止条件、循环搜索。广度优先搜索代码实现就是采用迭代,适合求解两个节点的最短路径问题。
2025-02-18 11:30:13
332
原创 【Day42 LeetCode】单调栈问题Ⅱ
对于当前元素,只要知道其左边第一个比它小的元素和右边第一个比它小的元素,就可以得到一个矩形,在这些矩形中找到面积最大的那一个。这很明显可以使用单调栈来进行辅助求解。单调栈是一种技巧,适合用于找数组中元素的右边或者左边第一个比自己大或者小的元素的位置。
2025-02-18 10:04:21
253
原创 【Day40 LeetCode】动态规划DP 回文子串问题
dp数组如果采用一维的,很难进行推导。采用二维,一开始的想法是dp[i][j]表示s[i]~s[j]之间回文子串的个数,这样发现在推导递推公式时遇到困难,例如在s[i]==s[j]时,不知道s[i+1:j-1]是否是回文子串。所以这样的定义不合理,所以让dp[i][j]表示s[i:j]是否是回文子串就好。这样递推公式就好推导,当s[i]==s[j],如果j-i<=2,则dp[i][j] = 1,否则dp[i][j] = dp[i+1][j-1];当s[i]!
2025-02-14 16:48:03
1094
原创 【Day39 LeetCode】动态规划DP 编辑问题
采用动态规划来解决子序列问题。有两个字符串,采用二维dp数组,dp[i][j]表示0~i-1的s子字符串中含有0 ~j-1的t子字符串的个数。递推公式分为s[i - 1] 与 t[j - 1]相等和不相等的情况由递推公式可知,当前值dp[i][j]只与其上方的值和左上方值有关,可以将二维数组优化成一维数组,代码如下。
2025-02-13 14:45:37
717
原创 【Day38 LeetCode】动态规划DP 子序列问题Ⅱ
确定dp数组含义,dp[i][j]表示长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列的长度。dp转移关系,对于当前值dp[i][j], 分为text1[i - 1] 与 text2[j - 1]相同与不相同两种情况。text1[i - 1] 与 text2[j - 1]相同时,这两个字符可以作为最长公共子序列的一部分,dpijdpi−1j−11;
2025-02-12 21:54:16
1169
原创 【Day37 LeetCode】动态规划DP Ⅹ 子序列问题
这题动态规划比较容易想到,dp[i]就是表示以nums[i]为结尾的数组最长递增子序列的长度,递推公式就是找到比当前值小的数(保证连续)的dp值+1,时间复杂度是O(n^2)这题在时间复杂度上还有优化的点,可以看到在二重循环中,即使我们已经找到比当前值小的数a后仍需遍历完,因为之后可能还会有比当前值小的数b,且可能是最长递增子序列,因为以a结尾的最长递增子数组长度可能比以b结尾的短。而假设我们知道之前的遍历情况,,贪心的想,我们即可。
2025-02-11 13:34:27
646
原创 【Day36 LeetCode】动态规划DP Ⅸ 股票问题
这题在的基础上交易次数由2次变成了k次,只是每天的股票状态变多了而已,只要搞清楚有什么状态以及状态之间如何转移就很容易解决。
2025-02-10 14:24:55
334
原创 【Day35 LeetCode】动态规划DP Ⅷ 买卖股票
这题之前贪心部分做过,找到前面股票的最低值,每次买卖股票都与之前的最低值进行交易,再找到利润最大的那次交易。采用动态规划的思想来解决这题,每天有两个状态,持有股票和不持有股票,因此dp数组应该是二维的,dp[i][0]/dp[i][1]表示第i天持有/不持有股票时所拥有的最大利润。递推公式是,当天可以不买股票和买股票,持有股票的利润是在昨天持有股票的利润(今天不买)和今天买股票的开销中取最大值(因为只能买卖一次),dpi0maxdpi−10−pricesi]);
2025-02-08 11:18:16
968
原创 【Day34 LeetCode】动态规划DP Ⅶ 打家劫舍
首先确定dp数组,dp[i]表示从0~i房间最大可以获得的金额数然后确定dp方程,对于当前房间i,dp[i]取决于偷不偷当前房间,如果偷当前房间,则前一个房间不能包括,如果不偷当前房间,就可以包括前一个房间。
2025-02-07 11:30:40
408
原创 【Day33 LeetCode】动态规划DP Ⅵ 背包问题
本质是完全背包问题,以最终的金额数amount为背包容量,不同面额的硬币为物品,物品数量无数,求装满物品需要的最少物品数。直接套用完全背包模板。由于求最少物品数是在 装满物品的方法里寻找,那么是寻找装满物品的组合 还是 排列呢?组合,因为最少物品数与顺序无关,所以采用组合即可。其实采用排列也是可以的,因为都是在结果里找到最少物品数,只是排列的结果范围更多。下面是组合的代码:先遍历物品,再遍历背包下面是排列的代码:先遍历背包,再遍历物品。
2025-02-06 22:32:31
456
原创 【Day32 LeetCode】动态规划DP Ⅴ 完全背包
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大,这就是完全背包问题。完全背包和01背包的区别在于物品的数量是只有一个和无数个,如下图所示。下面介绍使用动态规划解决完全背包:1、首先是dp数组,。2、确定递推公式,对于当前值dp[i][j]仍有选与不选物品i两个选择,所以 递推公式为dpijmaxdpi−1jdpij−weig。
2025-02-06 20:15:53
1003
原创 【Day 30 LeetCode】动态规划DP
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大,这就是标准的背包问题。我们采用动态规划的思想去解决背包问题。首先需要确定dp数组,有两个维度,物品和重量,。然后再确定递推公式,对于物品i,有放入背包和不放入两种选择,所以递推公式为dpijmaxdpi−1jdpi−1j−weighti]]valuesi])
2025-02-05 20:27:14
736
原创 【Day29 LeetCode】动态规划DP
首先是dp数组,dp[i][j]表示从起点(0, 0)到达当前位置(i, j)的路径数,转移方程从只能向下和向右移动可知,初始化边界可直观推出第一行和第一列上的位置只有一条路径。空间复杂度优化,采用一维数组来记录一行的状态,通过循环来更新dp[i-1][j]的值。
2025-01-28 15:40:39
568
原创 【Day27 LeetCode】贪心Ⅴ
与昨天的区间问题相似,需要合并区间,可以先,当前区间与已经合并的最近区间对比,看是否有重叠部分,有重叠则合并。也可以,要写仿函数,并且要与前面“已经合并”的区间都进行对比,因为按右区间排序区间范围可大可小,可能一个区间包含了前面好几个独立的小区间。推荐按左区间排序,简单直接。
2025-01-24 11:55:55
421
原创 【Day25 LeetCode】贪心Ⅲ
这道题直接想法是采用二重循环暴力搜索,简单粗暴但是会超时,是因为以每个点为起点最坏的情况可能都要遍历完全部的序列,有大量重复的操作,那有没有优化的地方呢?ijj可以得出。可以通过这个结论避免大量重复搜索,每个位置只会经过一次。
2025-01-23 21:26:00
1124
原创 【Day24 LeetCode】贪心Ⅱ
这题第一想法是使用动态规划做,每天有两个状态,持有股票和非持有股票,每次计算这两个状态下的最优值。贪心的做法就是 只要当前股票值会在明天上升,则在当前进行购买,在明天进行售卖获取利润。因为要求只能持有一只股票,即使price[i]到price[j]之间股票一直在涨,亦可将利润划分成pricej−priceipricej−pricej−1])pricej−1−pricej−2])...pricei1−pri。
2025-01-22 23:29:16
877
原创 【Day23 LeetCode】贪心算法题
贪心没有套路,只有碰运气(bushi),举反例看看是否可行,(运气好)刚好贪心策略的局部最优就是全局最优。
2025-01-21 22:19:31
1013
原创 【Day22 LeetCode】回溯--排列
这题是找子序列,不能采用排序破坏序列的原有顺序。寻找非递减子序列采用回溯直接套用模板很容易写出代码的框架,但是难点在于如何对结果去重。前几天使用的先排序再判断相邻元素是否是横向重复还是纵向重复在此时就不管用了,不管用的原因在于重复元素的相对位置此时不是相邻的。但子结果非递减子序列顺序是固定的,因此,重复的结果的顺序也是一模一样的(不像组合的重复结果顺序是不同的),所以最先的想法是采用set集合来对子结果进行去重。但这样效率很低,需要去判断子结果是否相同,最后还需要将集合转换成vector。
2025-01-18 16:28:37
912
原创 【Day21 LeetCode】回溯--子集
与昨天的分隔字符串类似,只不过对子字符串的要求不一样。这里要求子字符串得是在 0~255,不含前导零,并且要求划分成四个子字符串。分割字符串的思路:以0为起点,在函数体的循环中枚举当前有效子字符串的终点,不同终点构成了树的同一层节点,在一个终点中,以当前终点的下一个节点作为起点开始递归下一个子字符串。再添加一些细节,如 判断有效的字符串、终止条件。
2025-01-17 10:42:13
365
原创 【Day20 LeetCode】回溯--组合类Ⅱ
这题和昨天的组合总和Ⅲ、组合问题相似,这题可以重复选取元素,在于函数体内递归时传入的idx是idx而不是idx+1,表示可以重复选取,且无数量限制。但直接套用的时间复杂度较高,需要剪枝。对于是常见手段。
2025-01-16 10:16:24
403
原创 【Day19 LeetCode】回溯--组合类
回溯也是需要明确三点:首先,回溯的目的是进行深度搜索,通常需要运用辅助空间path来记录当前路径,这个由递归完成;当前节点的回溯需要由循环/枚举来进行全搜索;中止条件通常为深度。
2025-01-15 10:51:41
348
原创 【Day18 LeetCode】二叉搜索树的操作Ⅱ
根据二叉搜索树的有序性,如果当前根节点在区间左侧,则舍弃左子树和根节点,往右子树遍历;如果在区间右侧,舍弃右子树和根节点,往左子树遍历。
2025-01-14 23:52:07
319
原创 【Day 17 LeetCode】二叉搜索树的操作
思路:二叉搜索树的中序遍历是单调递增的,左-根-右。我们找到离目标值最近的那个即可。为什么要找左或右子树为空的节点?是因为方便插入,除了插入一个节点操作后,。递归写法。
2025-01-13 12:02:42
204
原创 【Day16 LeetCode】二叉搜索树
二叉搜索树的性质是 中序遍历的结果是单调递增的,树中任意两不同节点值之间的最小差值一定会在中序遍历相邻两个节点中产生。所以,中序遍历一下就好。
2025-01-11 10:18:59
381
原创 【Day15 LeetCode】二叉搜索树
这题与昨天的通过中序和后序构建二叉树类似,主要思路都是找到根节点,再递归构建左右子树,只不过找根节点的方式变了而已,这题是根据最大值找根节点。
2025-01-10 21:08:44
221
原创 【Day 14 LeetCode】接着二叉树
比较直接的想法是层序遍历,每层从右往左,这样最后一个数就是左下角的值。递归做法有点难想,我最初的想法很丑陋,就是采用哈希表来记录每个深度最左边的节点,怎么找到最左?按照根右左的顺序遍历,每个深度的最后一个节点就是最左。后来沿着这个思路,发现哈希表不是必须的,维护一个最大深度即可。
2025-01-09 21:03:47
473
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人