js算法
文章平均质量分 76
丹丹的笑意
这个作者很懒,什么都没留下…
展开
-
学习记录:js算法(九十三):岛屿的最大面积
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。这个问题可以通过深度优先搜索(DFS)一次性遍历整个网格,避免重复计算和不必要的搜索。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0。给你一个大小为 m x n 的二进制矩阵 grid。岛屿的面积是岛上值为 1 的单元格的数目。原创 2024-11-13 01:18:17 · 251 阅读 · 0 评论 -
学习记录:js算法(九十二):克隆图
其主要思路是递归地遍历图中的每个节点,并在遍历过程中创建节点的克隆版本。为了避免重复克隆相同的节点,使用了一个 Map 结构 visited 来存储已经克隆过的节点,以节点的引用为键,克隆后的节点为值。给定节点将始终是图中的第一个节点(值为 1)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。● 每个克隆节点的邻居列表是在克隆过程中动态构建的,确保了克隆图的结构与原图完全一致。给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。原创 2024-11-13 01:16:05 · 435 阅读 · 0 评论 -
学习记录:js算法(九十一):岛屿数量
解决这道题目的关键在于理解和实现深度优先搜索(DFS)或广度优先搜索(BFS)算法来遍历网格,标记已访问的陆地,从而计算出独立的岛屿数量。这里提供一个基于DFS的解决方案。给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。原创 2024-11-10 19:43:52 · 382 阅读 · 0 评论 -
学习记录:js算法(九十):N皇后
N 皇后问题是一个经典的回溯问题,目标是在一个 N×N 的棋盘上放置 N 个皇后,使得没有两个皇后互相攻击。也就是说,任何两个皇后不能在同一行、同一列或同一对角线上。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。原创 2024-11-09 18:45:07 · 405 阅读 · 0 评论 -
学习记录:js算法(八十九):电话号码的字母组合
的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。原创 2024-11-09 18:42:22 · 434 阅读 · 0 评论 -
学习记录:js算法(八十八):分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串。返回 s 所有可能的分割方案。使用回溯结合简单的回文检测来解决。原创 2024-11-07 10:14:26 · 817 阅读 · 0 评论 -
学习记录:js算法(八十七):单词搜索
接着,检查当前坐标是否越界或当前字符是否与单词中的对应字符不匹配,如果是,则返回 false。基本思路是在网格中的每个可能的起点开始,尝试沿着四个方向(上、下、左、右)进行深度优先搜索,看是否能找到与目标单词匹配的路径。最后,使用两层循环遍历网格中的每个字符,从每个字符开始调用 dfs 函数,如果找到单词,立即返回 true。这段代码通过深度优先搜索的方式,逐步探索每个可能的路径,并在找到匹配时返回成功。在递归返回后,恢复当前字符的状态,以便后续的搜索使用,并返回 found 的值。原创 2024-11-06 16:21:39 · 643 阅读 · 0 评论 -
学习记录:js算法(八十六):全排列 II
我们需要找到所有不重复的全排列,考虑到序列中可能包含重复的数字,我们需要在递归过程中避免生成重复的排列。,按任意顺序 返回所有不重复的全排列。给定一个可包含重复数字的序列。原创 2024-11-05 22:04:43 · 314 阅读 · 0 评论 -
学习记录:js算法(八十五):组合总和 II
与上一个问题不同的是,这里需要找到所有和为目标值的组合,并且每个数字在每个组合中只能使用一次。我们可以使用类似于上一题的递归方法,但是需要对数组进行排序并跳过重复的元素以避免重复的组合。中的每个数字在每个组合中只能使用 一次。注意:解集不能包含重复的组合。给定一个候选人编号的集合。中所有可以使数字和为。原创 2024-11-04 15:05:02 · 262 阅读 · 0 评论 -
学习记录:js算法(八十四):子集 II
要解决这个问题,我们可以基于之前提到的回溯算法思路进行扩展,以处理包含重复元素的情况。关键在于,在递归过程中增加一个判断条件来跳过已经处理过的重复元素,以避免生成重复的子集。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。,其中可能包含重复元素,请你返回该数组所有可能的。原创 2024-11-04 15:00:35 · 801 阅读 · 0 评论 -
学习记录:js算法(八十三):全排列
对于这道题,我们想要生成所有可能的全排列,可以看作是从剩余的未选数字中每次选择一个数字,直到所有数字都被选完为止。,返回其 所有可能的全排列。给定一个不含重复数字的数组。原创 2024-11-04 14:02:44 · 691 阅读 · 0 评论 -
学习记录:js算法(八十二):组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。回溯算法是一种通过试探搜索(试错法)来寻找所有可能的解决方案的算法。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。原创 2024-11-01 09:17:44 · 867 阅读 · 0 评论 -
学习记录:js算法(八十一):子集
解决这道题目的关键在于理解并应用回溯算法来生成所有可能的子集。回溯算法是一种通过试错来寻找解的方法,当发现现有的路径不符合解的条件时,会回退到上一步,尝试其他可能的路径。对于子集问题,我们可以通过递归的方式,逐个决定每个元素是否加入当前子集中。给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。原创 2024-11-01 08:48:25 · 311 阅读 · 0 评论 -
学习记录:js算法(八十):去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。为了解决这个问题,我们可以采用贪心+单调栈的思想来实现。最小(要求不能打乱其他字符的相对位置)。原创 2024-11-01 08:43:52 · 390 阅读 · 0 评论 -
学习记录:js算法(七十九):有效的括号字符串
个字符中,是否可以形成有效的字符串,并且当前未匹配的左括号数量为。请你检验这个字符串是否为有效字符串,如果是 有效 字符串返回。思路:使用动态规划来解决这个问题。我们定义一个二维数组。给你一个只包含三种字符的字符串,支持的字符类型分别是。原创 2024-10-29 10:22:26 · 755 阅读 · 0 评论 -
学习记录:js算法(七十八):划分字母区间
/ 记录每个字符最后出现的位置i++) {i++;讲解初始化最后出现位置数组创建一个长度为 26 的数组lastIndex,用于存储每个字母最后出现的位置。初始化为 -1,表示尚未出现。记录每个字符最后出现的位置遍历字符串s的每个字符,使用charCodeAt方法获取字符的 Unicode 编码。通过计算出当前字符在lastIndex数组中的索引。将该字符最后出现的位置(索引i)存储在lastIndex中。初始化结果数组和起始位置创建一个空数组result。原创 2024-10-28 23:17:40 · 894 阅读 · 0 评论 -
学习记录:js算法(七十七):合并若干三元组以形成目标三元组
给你一个二维整数数组 triplets ,其中 triplets[i] = [ai, bi, ci] 表示第 i 个 三元组。例如,triplets[i] = [2, 5, 3] 且 triplets[j] = [1, 7, 5],triplets[j] 将会更新为 [max(2, 1), max(5, 7), max(3, 5)] = [2, 7, 5]。= j),并 更新 triplets[j] 为 [max(ai, aj), max(bi, bj), max(ci, cj)]。原创 2024-10-27 21:01:00 · 412 阅读 · 0 评论 -
学习记录:js算法(七十六):一手顺子
这是因为如果我们要组成连续的序列,那么数量最多的牌(频率最高)应该尽可能放在序列的中间,而频率较低的牌则放在序列的两端,这样更容易组成连续的序列。为了满足这些条件,我们首先需要统计每张牌出现的次数,然后从最小的牌开始,尝试组成大小为。手中有一把牌,她想要重新排列这些牌,分成若干组,使每一组的牌数都是。这道题目的关键在于理解“连续的牌”和“每组牌数都是。如果她可能重新排列这些牌,返回。原创 2024-10-27 20:11:00 · 700 阅读 · 0 评论 -
学习记录:js算法(七十五): 加油站
来存储每个加油站的净汽油量,并通过一次遍历(时间复杂度 O(n))有效地判断是否存在一个起点,使得从该起点出发能够完成一圈。可以通过贪心算法解决,主要的思路是寻找一个起始点,从这个点出发,汽车能够通过不断加油并且不耗尽油箱中的油,完成整个环路的行驶。,用于判断在一个环形路线上,是否可以从某个加油站出发,顺利完成一圈而不耗尽汽油。,用于判断在一个环形路线上,是否可以从某个加油站出发,顺利完成一圈而不耗尽汽油。,用于判断在一个环形路线上,是否可以从某个加油站出发,顺利完成一圈而不耗尽汽油。原创 2024-10-25 22:09:48 · 858 阅读 · 0 评论 -
学习记录:js算法(七十四):跳跃游戏II
动态规划的思路是维护一个数组 dp,其中 dp[i] 表示到达索引 i 所需的最小跳跃次数。我们可以通过遍历每个位置来更新后续位置的跳跃次数。这道题目的解决方案可以通过贪心算法来实现,核心思想是尽可能地让每次跳跃都能让我们到达更远的位置。BFS 可以用于寻找最短路径,因此我们可以将每个位置视为图中的节点,使用队列来进行广度优先搜索。DFS 也可以用来解决这个问题,但效率较低,因为它可能会遍历所有可能的路径。向前跳转的最大长度。生成的测试用例可以到达。处,你可以跳转到任意。原创 2024-10-25 00:04:00 · 1061 阅读 · 0 评论 -
学习记录:js算法(七十三):跳跃游戏
解决这个问题,可以采用贪心算法的思路,动态规划也可以,但贪心算法更简洁高效。核心思想是维护一个可达到的最远距离,每次更新这个最远距离,并用它来决定>下一步的跳跃位置。通过递归,我们可以尝试从当前下标跳跃到所有可能的下标,并记录已经计算过的结果,以避免重复计算。可以递归地尝试从当前位置跳跃到所有可能的下一个位置,直到达到最后一个下标或者确认无法到达。,我们可以逐层探索每个可跳跃的位置,直到找到是否能够到达最后一个下标。数组中的每个元素代表你在该位置可以跳跃的。判断你是否能够到达最后一个下标,如果可以,返回。原创 2024-10-23 22:12:15 · 744 阅读 · 0 评论 -
学习记录:js算法(七十二): 最大子数组和
贪心算法在这里指的是在每一步都做出局部最优的选择,希望这样能够得到全局最优解。在最大子数组和问题中,这个局部最优的选择就是在当前位置决定是否开始一个新的子数组,还是继续扩展当前的子数组。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。是数组中的一个连续部分。原创 2024-10-22 14:48:51 · 987 阅读 · 0 评论 -
学习记录:js算法(七十一): 买卖股票的最佳时机
这道题目的关键在于找到股票价格的最低点和之后的最高点,因为买卖之间的差价即为利润。我们可以通过一次遍历来解决这个问题,维护两个变量:一个是遍历至今的最低价格。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回。设计一个算法来计算你所能获取的最大利润。你只能选择 某一天 买入这只股票,并选择在。表示一支给定股票第 i 天的价格。,另一个是当前能获得的最大利润。原创 2024-10-21 13:40:40 · 318 阅读 · 0 评论 -
学习记录:js算法(七十):分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。,这个孩子会得到满足。你的目标是满足尽可能多的孩子,并输出这个最大数值。,这是能让孩子们满足胃口的饼干的最小尺寸;,我们可以将这个饼干。原创 2024-10-20 21:48:30 · 313 阅读 · 0 评论 -
学习记录:js算法(六十七):任务调度器
每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制:两个 相同种类 的任务之间必须有长度为。返回完成所有任务所需要的 最短时间间隔。需要执行的任务列表,用字母。表示,以及一个冷却时间。原创 2024-10-19 18:59:32 · 971 阅读 · 0 评论 -
学习记录:js算法(六十八):插入区间
升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。给你一个 无重叠的 ,按照区间起始端点排序的区间列表。你可以创建一个新数组然后返回它。表示另一个区间的开始和结束。个区间的开始和结束,并且。注意 你不需要原地修改。原创 2024-10-19 19:24:44 · 371 阅读 · 0 评论 -
学习记录:js算法(六十九):合并区间
请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。表示若干个区间的集合,其中单个区间为。原创 2024-10-19 19:31:23 · 324 阅读 · 0 评论 -
学习记录:js算法(六十六):数组中的第K个最大元素
我们可以使用快速选择算法,这是一种基于快速排序的选择算法变种,用于找到未排序数组中的第 > 个元素,而无需完全排序数组。要找到数组中第 > 个最大的元素,且要求时间复杂度为。请注意,你需要找的是数组排序后的第。个最大的元素,而不是第。原创 2024-10-16 09:39:03 · 598 阅读 · 0 评论 -
学习记录:js算法(六十五):最接近原点的 K 个点
这里,平面上两点之间的距离是 欧几里德距离**( √(x1 - x2)2 + (y1 - y2)2 )**。你可以按 任何顺序 返回答案。除了点坐标的顺序之外,答案 确保 是 唯一 的。平面上的一个点,并且是一个整数。原创 2024-10-16 09:34:18 · 587 阅读 · 0 评论 -
学习记录:js算法(六十四):最后一块石头的重量
有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎;如果x!= y,那么重量为加粗样式x 的石头将会完全粉碎,而重量为y的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回0。输入:[2,7,4,1,8,1]输出:1解释:先选出 7 和 8,得到 1,所以数组转换为 [2,4,1,1,1],原创 2024-10-14 23:47:35 · 943 阅读 · 0 评论 -
学习记录:js算法(六十三):数据流中的第 K 大元素
且新元素大于堆顶元素,则替换堆顶元素并重新调整堆。这样,堆顶元素始终是当前数据流中的第。最小堆是一种特殊的完全二叉树,其中每个父节点的值都小于或等于其子节点的值。为了设计这样一个类,我们可以使用最小堆(优先队列)来实现。的最小堆,这样堆顶元素就是当前数据流中的第k大元素。,则直接将新元素添加到堆中;每次插入新元素时,若堆的大小未达到。在本问题中,我们维护一个大小为。后,返回当前数据流中第。设计一个找到数据流中第。原创 2024-10-13 16:08:52 · 434 阅读 · 0 评论 -
学习记录:js算法(六十二):单词搜索 II
单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。这个问题通常被称为“单词搜索”或“Boggle”游戏问题的扩展版本,其中目标是找出所有可能的单词。, 返回所有二维网格上的单词。和一个单词(字符串)列表。原创 2024-10-12 09:32:56 · 946 阅读 · 0 评论 -
学习记录:js算法(六十一):添加与搜索单词 - 数据结构设计
请你设计一个数据结构,支持 添加新单词 和 查找字符串是否与任何先前添加的字符串匹配。添加到数据结构中,之后可以对它进行匹配。如果数据结构中存在字符串与。都可以表示任何一个字母。原创 2024-10-11 22:03:53 · 672 阅读 · 0 评论 -
学习记录:js算法(一):存在重复元素、有效的字母异位词
js算法学习,第一天原创 2024-08-12 20:55:06 · 255 阅读 · 0 评论 -
学习记录:js算法(二):两数之和
两数之和原创 2024-08-13 21:04:14 · 274 阅读 · 0 评论 -
学习记录:js算法(三):字母异位词分组
学习算法这三天,Map对象的使用很频繁,需要抓紧学习一波了。原创 2024-08-14 22:11:21 · 402 阅读 · 0 评论 -
学习记录:js算法(四): 前 K 个高频元素
返回一个返回包含对象键名和键值的数组(二维数组):比如返回一个包含 Map 中所有键值对的迭代器(Iterator 对象,可以转成数组):比如Map()还是需要熟练掌握,确实好用。原创 2024-08-15 21:53:36 · 261 阅读 · 0 评论 -
学习记录:js算法(五):除自身以外数组的乘积
循环是基础。原创 2024-08-16 22:16:46 · 307 阅读 · 0 评论 -
学习记录:js算法(六):有效的数独、 最长连续序列
还是循环好使。原创 2024-08-18 00:46:23 · 619 阅读 · 0 评论 -
学习记录:js算法(七):有效的括号、最小栈
今天这两道题,都不是很难,更多考验是我对的理解和使用。原创 2024-08-18 18:11:27 · 422 阅读 · 0 评论