- 博客(141)
- 问答 (1)
- 收藏
- 关注
原创 学习记录:js算法(一百二十五):买卖股票的最佳时机含冷冻期
● dp[i][0] = max(dp[i-1][0], dp[i-1][2] - prices[i]):要么保持持有股票的状态,要么在第i天买入股票(需要在前一天不持有股票且不在冷冻期)。● dp[i][2] = max(dp[i-1][2], dp[i-1][1]):要么保持不持有股票且不在冷冻期的状态,要么从冷冻期状态过渡出来(前一天在冷冻期)。● dp[i][1] = dp[i-1][0] + prices[i]:在第i天卖出股票进入冷冻期。● dp[i][0]:第i天持有股票的最大收益;
2024-12-14 16:13:27
167
原创 学习记录:js算法(一百二十四):最长公共子序列
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。
2024-12-12 21:40:40
323
原创 学习记录:js算法(一百二十三):不同路径 II
给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。我们需要计算从起点到终点的不同路径数量,同时需要避开障碍物。基本思路是使用一个二维数组 dp 来存储从起点到每个格子的不同路径数量。为了避免障碍物,当遇到障碍物时,我们将该格子的路径数量设为 0。网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。返回机器人能够到达右下角的不同路径数量。
2024-12-12 21:38:44
392
原创 学习记录:js算法(一百二十二):不同路径
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。使用二维DP数组来追踪从起点到网格中每个位置的不同路径数量。问总共有多少条不同的路径?
2024-12-12 21:36:19
381
原创 学习记录:js算法(一百二十一):K 站中转内最便宜的航班
有 n 个城市通过一些航班连接。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。如果不存在这样的路线,则输出 -1。这个问题可以通过带有边权重的图的最短路径算法来解决,特别适合使用 Bellman-Ford 算法,因为 Bellman-Ford 算法可以处理带有限制的最短路径问题,如本题中的最多 k 站中转限制。
2024-12-12 21:32:43
364
原创 学习记录:js算法(一百二十):水位上升的泳池中游泳
你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。当然,在你游泳的时候你必须待在坐标方格里面。这个问题可以视为寻找在一个由不同高度平台组成的网格中,从左上角到右下角的最短路径,其中路径上的平台高度必须小于或等于当前时间(水位)。这可以通过使用类似Dijkstra算法的最短路径算法来解决,但在这里,我们关注的是时间(水位)而不是简单的边权重。在一个 n x n 的整数矩阵 grid 中,每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。
2024-12-08 23:31:19
272
原创 学习记录:js算法(一百一十九):网络延迟时间
给你一个列表 times,表示信号经过 有向 边的传递时间。times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。这个问题可以通过最短路径算法来解决,具体来说,可以使用Bellman-Ford算法或者Dijkstra算法的变种。但是,由于图是有向图并且没有负权重边,Dijkstra算法会更高效一些。现在,从某个节点 K 发出一个信号。如果不能使所有节点收到信号,返回 -1。有 n 个网络节点,标记为 1 到 n。
2024-12-08 23:29:25
331
原创 学习记录:js算法(一百一十八):连接所有点的最小费用
这个问题可以看作是一个经典的最小生成树(Minimum Spanning Tree,MST)问题,但与传统的基于边权重的MST问题略有不同,因为边的权重(即曼哈顿距离)需要在运行时计算。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi]。请你返回将所有点连接的最小总费用。
2024-12-08 23:26:46
347
原创 学习记录:js算法(一百一十七):重新安排行程
我们需要找到从“JFK”机场出发,遍历所有机票且不重复的路径。这实际上是一个深度优先搜索(DFS)的问题,需要构建一个图,并从“JFK”开始进行搜索,同时保持路径的字典序最小。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
2024-12-06 22:30:28
458
原创 学习记录:js算法(一百一十六):买卖股票的最佳时机 IV
○ 当 k 大于等于 prices 长度的一半时,我们可以进行无限次交易,这时采用贪心算法,每次价格上升就卖出,累积所有上升段的利润。给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。也就是说,你最多可以买 k 次,卖 k 次。○ DP的状态定义为 dp[t][d],表示在第 d 天结束时进行了 t 次交易的最大利润。○ 当 k 小于 prices 长度的一半时,使用一维DP来计算有限次交易的最大利润。
2024-12-06 22:28:35
653
原创 学习记录:js算法(一百一十五):买卖股票的最佳时机 III
● dp[k][i] = Math.max(dp[k][i-1], maxProfit),其中 maxProfit 是在第 i 天进行交易时可能获得的最大利润。● 但是,为了减少空间复杂度,我们可以使用四个变量来代替二维数组,分别代表没有交易、第一次买入、第一次卖出、第二次买入、第二次卖出的情况下的最大利润。● dp[k][i] 表示在第 i 天结束时,最多可以进行 k 次交易的情况下所能获得的最大利润。○ f2 表示不持有股票,且最多进行过一次买入和一次卖出操作的最大利润。你最多可以完成 两笔 交易。
2024-12-06 22:09:55
353
原创 学习记录:js算法(一百一十四):买卖股票的最佳时机 II
● dp[i] = max(dp[i-1], prices[i] - prices[j] + dp[j-1]),其中 j 为 i 之前的一个值,且 prices[i] > prices[j]。● 但是我们可以通过优化这个方程来简化计算过程,因为我们只需要考虑 dp[i-1] 和 prices[i] - prices[j] 的情况。● 如果 prices[i] > prices[i-1],那么我们可以卖出股票获得利润 prices[i] - prices[i-1]。● 累加所有的正向利润,即可得到最大利润。
2024-12-03 21:47:25
189
原创 学习记录:js算法(一百一十三):分割等和子集
这个问题本质上是一个背包问题的变种,被称为“分割等和子集”问题。我们的目标是判断是否存在一个子集,其元素和等于数组总和的一半。这个问题可以通过动态规划(DP)解决,使用一维DP数组来优化空间复杂度。给你一个 只包含正整数 的 非空 数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
2024-12-02 16:01:03
295
原创 学习记录:js算法(一百一十二):最长递增子序列
如果 nums[i] 大于 nums[j](其中 j < i),那么我们可以考虑将 nums[i] 添加到以 nums[j] 结尾的递增子序列中,因此可能会得到一个更长的递增子序列。此时,我们尝试更新 dp[i] = Math.max(dp[i], dp[j] + 1),表示以 nums[i] 结尾的最长子序列长度可能由以 nums[j] 结尾的子序列长度加 1 得到。基本思路是创建一个长度与原数组相同的新数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长严格递增子序列的长度。
2024-12-01 19:37:27
402
原创 学习记录:js算法(一百一十一): 单词拆分 II
给定一个字符串 s 和一个字符串字典 wordDict ,在字符串 s 中增加空格来构建一个句子,使得句子中所有的单词都在词典中。以任意顺序 返回所有这些可能的句子。对于这道题,我们也可以使用一维动态规划(DP)的方法来解决。这种方法可以有效地减少空间复杂度,并且避免了回溯所带来的大量重复计算。运用回溯的思想,我们可以使用递归来构建所有可能的句子。注意:词典中的同一个单词可能在分段中被重复使用多次。
2024-12-01 19:34:53
840
原创 学习记录:js算法(一百一十): 单词拆分
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。目标是判断字符串 s 能否由字典 wordDict 中的单词拼接而成。使用一维DP数组的思想,我们可以追踪字符串前缀是否能够被拼接。注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
2024-12-01 19:28:41
142
原创 学习记录:js算法(一百零九): 乘积最大子数组
目标是找到具有最大乘积的连续子数组。由于数组中的元素可能是正数、负数或零,乘积可能随着连续负数的出现而变得很大或很小。因此,我们需要同时追踪最大乘积和最小乘积。给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续。(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。
2024-12-01 19:26:32
196
原创 学习记录:js算法(一百零八):零钱兑换
标是找到凑成总金额 amount 的最少硬币个数。我们可以定义 dp[i] 为凑成金额 i 所需的最少硬币数。计算并返回可以凑成总金额所需的 最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。你可以认为每种硬币的数量是无限的。
2024-12-01 19:24:44
387
原创 学习记录:js算法(一百零七):解码方法
具体来说,dp[i] 表示字符串 s 的前 i 个字符的解码方法总数。然而,在 解码 已编码的消息时,你意识到有许多不同的方式来解码,因为有些编码被包含在其它编码当中(“2” 和 “5” 与 “25”)。给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数。消息不能分组为 (1, 11, 06) ,因为 “06” 不是一个合法编码(只有 “6” 是合法的)。“AAJF” ,将消息分组为 (1, 1, 10, 6)“KJF” ,将消息分组为 (11, 10, 6)
2024-12-01 19:23:03
341
原创 学习记录:js算法(一百零六):最长回文子串
通过这种分而治之的策略,我们能够在每个字符上计算出以它为中心的最长回文子串信息,进而找到整个字符串中的最长回文子串。这种方法相比暴力解法大大提高了效率,尤其是通过空间优化使用一维数组时,既保持了问题解决的高效性,又降低了空间复杂度。动态规划在这里的关键是将问题分解为较小的子问题,并利用已解决的子问题结果来构建更大的解。给你一个字符串 s,找到 s 中最长的回文子串。
2024-12-01 19:19:43
413
原创 学习记录:js算法(一百零五):回文子串
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。子字符串 是字符串中的由连续字符组成的一个序列。回文字符串 是正着读和倒过来读一样的字符串。
2024-11-24 20:37:11
189
原创 学习记录:js算法(一百零四):打家劫舍II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。这个问题可以分解为两个子问题:一个是不偷第一间房子,另一个是不偷最后一间房子。由于首尾相连,我们不能同时偷这两间房子,因此需要分两部分求解,最后取两者中的最大值。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
2024-11-24 20:35:52
281
原创 学习记录:js算法(一百零三):打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。打家劫舍问题(House Robber)是一个典型的动态规划问题。
2024-11-24 20:34:13
192
原创 学习记录:js算法(一百零二):使用最小花费爬楼梯
这道题可以用动态规划(Dynamic Programming, DP)的方法来解决。我们定义一个一维数组dp,其中dp[i]表示到达第i阶楼梯所需要的最小花费。由于我们可以选择爬1阶或2阶,所以dp[i]可以从dp[i-1]和dp[i-2]转移而来,同时需要加上当前阶的花费cost[i]。给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
2024-11-24 20:32:29
343
原创 学习记录:js算法(一百零一):爬楼梯
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。子字符串 是字符串中的由连续字符组成的一个序列。回文字符串 是正着读和倒过来读一样的字符串。
2024-11-24 20:30:47
282
原创 学习记录:js算法(一百):单词接龙
单词接龙问题(Word Ladder)是LeetCode上一道有名的难题,其目标是从一个起始单词转换到一个目标单词,每次只改变一个字母,且每一步得到的单词都必须在给定的词典中。字典 wordList 中从单词 beginWord 到 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> …● 对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
2024-11-19 15:11:29
417
原创 学习记录:js算法(九十九):冗余连接
给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。冗余连接问题(Redundant Connection)涉及到一棵无向树,该树有一个额外的边,导致图中出现了环。问题要求找出这条多余的边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。
2024-11-19 15:09:23
483
原创 学习记录:js算法(九十八):课程表 II
给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi。这个问题可以通过拓扑排序来解决,拓扑排序是一种有向无环图(DAG)的线性排序,使得对于图中的每一条有向边 u -> v,节点 u 都出现在节点 v 之前。在这个问题中,课程可以被视为节点,而先修课程关系则是有向边。如果不可能完成所有课程,返回 一个空数组。例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1]。
2024-11-19 14:51:02
480
原创 学习记录:js算法(九十七):课程表
在这个问题中,课程可以看作顶点,先修关系构成有向边,我们需要检查这个图是否存在环,如果不存在环,则可以完成所有课程的学习。先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi。你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。否则,返回 false。● 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1。
2024-11-19 14:47:16
436
原创 学习记录:js算法(九十六):腐烂的橘子
腐烂的橘子问题(Rotting Oranges)涉及到在一个给定的网格中,某些单元格包含新鲜橘子(值为 1),某些单元格包含腐烂的橘子(值为 2),还有些单元格为空(值为 0)。腐烂的橘子会传染给相邻(上下左右)的新鲜橘子,使得它们在一分钟后也腐烂。任务是计算直到所有新鲜橘子都腐烂所需的分钟数,如果不可能则返回 -1。返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。值 2 代表腐烂的橘子。值 0 代表空单元格;值 1 代表新鲜橘子;
2024-11-19 14:44:51
245
原创 学习记录:js算法(九十五):被围绕的区域
● 围绕:如果您可以用 ‘X’ 单元格 连接这个区域,并且区域中没有任何单元格位于 board 边缘,则该区域被 ‘X’ 单元格围绕。主要思路是先标记所有与边界相连的 ‘O’,然后再遍历整个网格,将未被标记的 ‘O’ 替换为 ‘X’。通过将输入矩阵 board 中的所有 ‘O’ 替换为 ‘X’ 来 捕获被围绕的区域。● 连接:一个单元格与水平或垂直方向上相邻的单元格连接。● 区域:连接所有 ‘O’ 的单元格来形成一个区域。
2024-11-19 14:42:54
418
原创 学习记录:js算法(九十四):太平洋大西洋水流问题
太平洋大西洋水流问题是关于在一个给定的二维高度图上,确定哪些单元格中的水可以同时流向太平洋和大西洋。返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋。岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。“太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。
2024-11-19 14:40:55
341
原创 学习记录:js算法(九十三):岛屿的最大面积
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。这个问题可以通过深度优先搜索(DFS)一次性遍历整个网格,避免重复计算和不必要的搜索。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0。给你一个大小为 m x n 的二进制矩阵 grid。岛屿的面积是岛上值为 1 的单元格的数目。
2024-11-13 01:18:17
421
原创 学习记录:js算法(九十二):克隆图
其主要思路是递归地遍历图中的每个节点,并在遍历过程中创建节点的克隆版本。为了避免重复克隆相同的节点,使用了一个 Map 结构 visited 来存储已经克隆过的节点,以节点的引用为键,克隆后的节点为值。给定节点将始终是图中的第一个节点(值为 1)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。● 每个克隆节点的邻居列表是在克隆过程中动态构建的,确保了克隆图的结构与原图完全一致。给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
2024-11-13 01:16:05
541
原创 学习记录:js算法(九十一):岛屿数量
解决这道题目的关键在于理解和实现深度优先搜索(DFS)或广度优先搜索(BFS)算法来遍历网格,标记已访问的陆地,从而计算出独立的岛屿数量。这里提供一个基于DFS的解决方案。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。
2024-11-10 19:43:52
425
原创 学习记录:js算法(九十):N皇后
N 皇后问题是一个经典的回溯问题,目标是在一个 N×N 的棋盘上放置 N 个皇后,使得没有两个皇后互相攻击。也就是说,任何两个皇后不能在同一行、同一列或同一对角线上。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
2024-11-09 18:45:07
457
原创 学习记录:js算法(八十八):分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。使用回溯结合简单的回文检测来解决。
2024-11-07 10:14:26
876
原创 学习记录:js算法(八十七):单词搜索
接着,检查当前坐标是否越界或当前字符是否与单词中的对应字符不匹配,如果是,则返回 false。基本思路是在网格中的每个可能的起点开始,尝试沿着四个方向(上、下、左、右)进行深度优先搜索,看是否能找到与目标单词匹配的路径。最后,使用两层循环遍历网格中的每个字符,从每个字符开始调用 dfs 函数,如果找到单词,立即返回 true。这段代码通过深度优先搜索的方式,逐步探索每个可能的路径,并在找到匹配时返回成功。在递归返回后,恢复当前字符的状态,以便后续的搜索使用,并返回 found 的值。
2024-11-06 16:21:39
689
原创 学习记录:js算法(八十六):全排列 II
我们需要找到所有不重复的全排列,考虑到序列中可能包含重复的数字,我们需要在递归过程中避免生成重复的排列。,按任意顺序 返回所有不重复的全排列。给定一个可包含重复数字的序列。
2024-11-05 22:04:43
344
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人