
LeetCode-待复习
再看几遍
犬兄的海角
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode-707-设计链表
我们需要保存链表的虚拟头节点以及其长度用于遍历链表。其中插入删除的操作需要注意前后指针的指向。类型,值得注意的是,考虑到我们需要先声明后定义,故先声明。对象,这样能够确保返回的是对象指针。值得注意的是,我们使用。原创 2023-04-07 13:35:33 · 604 阅读 · 0 评论 -
LeetCode-165-比较版本号
时,我们可以计算出当前的版本号。而后我们对比两个字符串的版本号的值,若不相等则直接返回对比结果,否则继续移动指针进行判断。我们可以利用双指针指向两个字符串。原创 2023-04-07 12:57:47 · 764 阅读 · 0 评论 -
LeetCode-318-最大单词长度乘积
我们可以利用一个长度为26的01串来记录每个字符串中每个字符出现的情况。而后我们只需要遍历整个字符串,并计算任意两个01串之间相与的结果是否为0即可判断是否有重复字符出现,并最终更新长度的乘积即可。原创 2023-04-03 16:48:13 · 362 阅读 · 0 评论 -
LeetCode-51-N 皇后
在回溯当中,我们按照每行寻找有无可以放置的位置,若此时行数等于总行数则直接将当前结果压入最终结果中。否则我们首先判断当前列、主对角线和副对角线上的所在列是否有人占用,有则直接跳过,否则我们将当前节点位置修改为。记录副对角线上的使用情况。值得注意的是,我们主对角线上的序号是自左下到右上,副对角线上的序号是自左上到右下。递归结束后我们将当前节点的状态改回为之前的状态并修改矩阵的值。我们可以利用回溯搜索所有的可能。记录主对角线上的使用情况,数组。记录每一列的使用情况,数组。原创 2023-04-03 16:21:56 · 289 阅读 · 0 评论 -
LeetCode-77-组合
记录当前的组合,而后我们开始进行遍历。若当前组合中数字的个数恰好为。我们可以使用回溯进行遍历组合。我们首先利用二维数组。的区间进行循环并不断向记录当前组合的。中添加元素,并在递归调用之后。,我们直接将当前组合加入。原创 2023-04-03 15:28:25 · 116 阅读 · 0 评论 -
LeetCode-695-岛屿的最大面积
我们可以遍历图中的每一个节点,在遍历之后将其值修改为 0 并将当前面积更新为 1。而后遍历其上下左右四个方向,返回其相邻区域的面积并加上当前的面积,最终返回即可。值得注意的是,为了避免重复查找相同的节点,我们可以直接修改节点的值来进行避免。原创 2023-04-03 15:22:35 · 206 阅读 · 0 评论 -
LeetCode-1114-按序打印
根据 C++ 标准,在一个线程尝试对一个 mutex 对象进行 unlock 操作时,mutex 对象的所有权必须在这个线程上;也就是说,应该 由同一个线程来对一个 mutex 对象进行 lock 和 unlock 操作,否则会产生未定义行为。基于以上背景,因为 mutex 对象本身是不保护任何数据的,我们只是通过 mutex 的机制来保护数据被同时访问,所以最好 使用 lock_guard 或者 unique_lock 提供的 RAII 机制来管理 mutex 对象,而不是直接操作 mutex 对象;原创 2023-04-03 15:01:06 · 181 阅读 · 0 评论 -
LeetCode-1574-删除最短的子数组使剩余数组有序
在获得最后一个非递减数组之后,显然我们现在需要遍历第一个非递减数组,并确定对于第一个非递减数组每一位,最后一个非递减数组中大于等于他的数的位置,并对最短的子数组长度进行更新。若出现第一个子数组非递减的情况则直接跳出循环。考虑到我们需要删除连续的子数组,因此我们最终保留的肯定是第一个非递减数组和最后一个非递减数组中的一部分,因此我们先从后向前进行遍历,找到最后一个非递减数组。原创 2023-03-25 18:07:53 · 137 阅读 · 0 评论 -
LeetCode-1032-字符流
我们可以对其构建一棵字典树用于后续查找。考虑到我们需要查找的是字符串的后缀是否匹配,因此我们先将字符串逆序之后再对其构建字典树。同时考虑到我们需要匹配当前的字符流,因此我们也从后向前进行遍历,且遍历次数最多为 200 遍,最终判断能否找到对应的字典树末端节点。原创 2023-03-24 22:54:21 · 125 阅读 · 0 评论 -
LeetCode-1626-无矛盾的最佳球队
我们一次比较其前面的每一个人,由于数组已经按照分数进行升序排序,故其前方的每一个人的得分都小于等于他。若前方的人年龄小于等于他则说明当前组合合法,我们获得诸多组合中的分数最大值并加上当前球员的得分,并统计所有组合中的最大得分。的形式将分数和年龄集合到一个数组中,而后对其进行升序排列,这样子每一项优先使用分数进行排序,当分数相同时使用年龄进行排序。(值得注意的是,分数相同时使用年龄进行排序能够避免出现相同分数的人年龄无序导致判断错误的情况)个人确定上场时,此时的最高得分。记录当排序后的数组的第。原创 2023-03-22 10:55:47 · 139 阅读 · 0 评论 -
LeetCode-828-统计子串中的唯一字符
我们可以遍历哈希表中的每一个字符,获得仅包含当前一个字符的子字符串并累加即可获得最终结果。我们可以使用哈希表来记录字符串中每个字符出现的位置。考虑到子字符串必须是连续的,对于字符。而言,假设其上一次出现的位置是。,显然我们可获得的字符串个数为。,下一次出现的位置是。原创 2023-03-21 13:19:31 · 130 阅读 · 0 评论 -
LeetCode-1012-至少有 1 位重复的数字
位位置,前几位产生满足条件的情况数总和。显然比起寻找至少有一位重复的数字,更简单的方法是用总数减去每一位都不重复的数字。指向字符串的末尾时,说明我们已经遍历完当前字符串。为真说明当前合法,返回 1 ,否则返回 0。原创 2023-03-20 16:02:03 · 198 阅读 · 0 评论 -
LeetCode-1625-执行操作后字典序最小的字符串
考虑到实际上累加和轮转实际上是两个独立的动作,因此我们可以先枚举字符串所有轮转动作。而后对于每一种轮转动作,循环遍历每一种累加的可能,最终找到字典序最小的字符串。值得注意的是,在经过轮转之后,我们下一次移动到的位置与前一次位置之差一定是。的倍数,因此我们可以在轮转时直接加上相应的倍数。原创 2023-03-19 20:46:10 · 165 阅读 · 0 评论 -
LeetCode-329-矩阵中的最长递增路径
我们首先初始化记忆矩阵,而后对于每一个位置进行搜索。我们在搜索时对记忆矩阵进行判断,若其不为 0 则说明已经有了最长路径,我们直接返回对应的最长路径即可。否则我们向当前位置的四个方向进行搜索,若当前的新位置合法而且新位置上的值大于当前位置上的值,我们则考虑对于记忆矩阵中的最长路径进行更新。最终返回新的最长路径即可。我们可以使用 DFS 遍历整个二维矩阵,考虑到数据量,我们使用暴力算法可能会导致超时,为解决此问题我们可以考虑使用记忆化搜索进行加速,我们可以使用。记录从对应位置出发的最长递增路径长度。原创 2023-03-18 19:01:59 · 117 阅读 · 0 评论 -
LeetCode-334-递增的三元子序列
我们可以使用两个数组分别记录对于原数组中的第 i 位,其左边和右边的最小值和最大值,若存在有一位满足其左侧的最小值小于其自身且其自身小于其右侧的最大值,则直接返回 true。原创 2023-03-18 16:10:16 · 112 阅读 · 0 评论 -
LeetCode-1616-分割两个字符串得到回文串
我们可以使用双指针分别指向当前两个字符串的开头和结尾,若两者相等则进行循环并移动指针直至两个指针指向的字符不同。此时若左指针大于等于右指针,说明此时已经对字符串遍历完成,我们直接返回 true。**值得注意的是,此时可能存在一种情况,即左指针遍历的前半个区间与右指针遍历的后半个区间回文,但是中间未遍历的区间自己回文。**为此,考虑到我们不能确定我们最终需要使用字符串 a 还是 b 的中间区间,我们需要对两个区间都进行回文检查并返回响应结果。原创 2023-03-18 15:33:17 · 122 阅读 · 0 评论 -
LeetCode-324-摆动排序 II
考虑到在新的数组中,我们奇数位上的数字都要比相邻的偶数位上的数字大。因此我们可以先对数组进行排序,将前半部分较小的数字安排到偶数位上,将后半段较大的数字安排到奇数位上。值得注意的是,在此处我们可能会出现存在相邻数字相同的情况,因此我们还需要对数字的位置进行调整。考虑到若出现相同数字相邻的情况,一定是前半个区间的末尾和后半个区间的开头数字相同。为了避免出现这样的情况,我们可以先对前半个区间和后半个区间进行逆序操作,而后再组合成新数组。原创 2023-03-17 13:25:34 · 137 阅读 · 0 评论 -
LeetCode-315-计算右侧小于当前元素的个数
具体实现可参考。考虑到数组的长度范围过大,我们调用函数,首先对数组进行去重操作并保存在a中,并构建函数getId用于获得元素值与对应序号之间的映射关系。而后我们初始化数组c,用于储存数组a的前缀和。我们只需要从后向前遍历数组nums,就可以利用getId找到其在数组c中的对应序号。而后我们只需要计算此时c中对应位置左侧的前缀和即可获得当前数组中既在nums[i]右侧又小于nums[i]的元素。值得注意的是,此处为了加快运算,我们使用二进制中末尾为 1 的位置进行加速查找。而后我们根据当前的序号对应更新c。原创 2023-03-17 11:23:38 · 556 阅读 · 0 评论 -
LeetCode-2389-和有限的最长子序列
考虑到在本题中我们只需要或缺当前数组的子序列,并没有要求子序列必须是连续的。因此我们可以先对当前数组进行原地排序,而后我们从前向后利用二重循环添加需要的元素并判断当前元素的总和是否小于我们需要的queries[i]即可。原创 2023-03-17 09:40:02 · 95 阅读 · 0 评论 -
LeetCode-227-基本计算器 II
2、若为加号,则将当前数字加入栈中,最后计算总和;3、若为减号,则将当前数字的相反数加入栈中,最后计算总和;4、若为乘号或除号,则直接用当前栈中的栈顶元素与我们临时保存的。我们可以使用栈来实现数字的加减乘除。对于字符串中的每一个元素:1、若其为数字,则将其转化为。保存的是符号后面的元素。为此我们默认一开始的符号是。最终我们只需要对栈中的元素进行累加即可。进行乘除运算后加入栈中。值得注意的是,这里的。原创 2023-03-16 20:12:51 · 123 阅读 · 0 评论 -
LeetCode-2488-统计中位数为 K 的子数组
考虑到我们需要寻找非空子数组,且给定的正整数 k 应当为非空子数组的中位数,因此我们可以考虑使用 -1、0、1 来指代小于、等于、大于 k 的数。我们的目标是,当存在子数组的左侧在 k 的左边,右侧在 k 的右边,而且子数组中大于 k 的数与小于 k 的数之差为 0 或 1,此时等价于 k 为当前子数组的中位数。我们首先找到对应当前正整数 k 的坐标。,而后我们从头开始遍历数组,利用。原创 2023-03-16 19:04:17 · 133 阅读 · 0 评论 -
LeetCode-218-天际线问题
为了判断一个节点是否是关键点,我们可以注意判断建筑的每一条边,并寻找是否有建筑在这条边的正上方。若没有,则当前的节点就是关键点;否则对应建筑才是关键点。,而后对数组进行升序排序。基于以上背景,我们可以将所有建筑的边都加入数组。原创 2023-03-15 21:06:40 · 103 阅读 · 0 评论 -
LeetCode-212-单词搜索 II
我们可以使用 DFS 来遍历整个二维网格构成的图,能否按照字符串的顺序遍历每一个节点。其中,为了避免在查询有着相同前缀的单词时花费过多时间,我们可以使用字典树进行优化。我们首先构造字典树结构,参考。我们可以使用一个字典树中的一个节点来表示字符串中的一个字符,利用哈希表来储存下一个字符与对应字典树节点之间的映射关系。当一个字符串遍历完成时,我们将该节点的word修改为对应字符串的值。因此我们可以根据一个节点的word长度来判断当前单词是否遍历完成。原创 2023-03-14 15:27:05 · 75 阅读 · 0 评论 -
LeetCode-210-课程表 II
我们可以将课程之间的关系理解成一个图,我们需要遍历整张图,判断能否找到一个遍历了整张图的路径。值得注意的是,我们还需要判断当前图中是否有可能出现环,若出现环则肯定无法遍历。我们首先根据输入的数组构建我们的邻接矩阵edges,而后初始化访问数组visited用于在记录节点的访问状态,其中 0 表示未访问,1 表示正在访问,2 表示已经访问完成,并利用布尔变量valid表示当前图中是否出现环,数组result记录我们在遍历过程中遍历到的节点。原创 2023-03-13 18:50:12 · 231 阅读 · 0 评论 -
LeetCode-2383-赢得比赛需要的最少训练时长
我们可以利用贪心法计算我们当前需要的最少的用于锻炼经验和精力的时间。显然,我们想要求得最少的初始精力,我们需要将所有精力相加,而后将结果加一即为我们需要的最少精力。我们此时只需要对 0 和。求最大值即可获得我们需要花费给精力的时间。原创 2023-03-13 16:48:09 · 134 阅读 · 0 评论 -
LeetCode-204-计数质数
我们可以使用一个布尔数组来表示对应的每一个数字是否为质数。我们首先将布尔数组初始化为true,而后将该数字对应的所有倍数全部置为 false ,而后继续遍历整个布尔数组。显然,在遍历过程中所有合数都会被置为 false ,我们最终统计并返回所有值为 true 的个数即可。原创 2023-03-12 19:48:39 · 111 阅读 · 0 评论 -
LeetCode-1617-统计子树中城市之间最大距离
我们根据每一个可能的子串来计算当前子串对用树的直径即最大距离:我们首先利用二进制串 vis 表示每一个节点是否被访问过。而后我们遍历当前节点的每一个邻居节点,若其没有被访问过而且在当前的子串中,我们则将调用函数计算出以该邻居节点为根节点时,对应子树的最大距离。显然,以当前节点为子树根节点的最大距离用当比以邻居节点为子树根节点的最大距离加一。最终当子树中的所有节点都被遍历时,我们将当前子树对应直径的个数加一。我们可以使用16位的二进制串表示每个节点保留与否,从而表示每一个可能的子串。原创 2023-03-12 19:26:58 · 148 阅读 · 0 评论 -
LeetCode-78-子集
我们可以假设在每个节点上,我们都可以选择加入当前节点或者不加入当前节点,因此最终的结果可以构成一棵树,我们需要遍历整棵树的叶子节点并返回结果。因此我们可以使用回溯法来遍历整个树。我们从位置0开始进行遍历,每次我们都先将当前节点加入最终结果中,并调用函数探索加入当前节点后的结果,如此递归直至当前位置等于字符串的长度为止。而后我们将当前的节点退出,并继续探索推出后下一个位置的情况。原创 2023-03-12 18:59:50 · 79 阅读 · 0 评论 -
LeetCode-189-轮转数组
我们可以使用额外数组来春芳轮转后的新数组。我们将原数组中第 i 位的元素放到新数组的第 (i + k) % n 位上,而后我们重新将新数组的内容赋给原数组即可。原创 2023-03-11 23:39:34 · 110 阅读 · 0 评论 -
LeetCode-17.05.-字母与数字
我们可以使用能够前缀和来表示当前数组中字母和数字出现次数之差,若出现字母则将前缀和加一,若出现数字则将前缀和减一。而后我们在哈希表中查找当前前缀和是否存在:1、若存在,我们判断当前位置的前缀和与第一次出现前缀和的距离是否大于当前的最大子数组长度,若大于则对子数组长度与起始位置进行更新;2、若不存在,我们向哈希表中储存当前前缀和与出现位置之间的映射关系。最终我们只需要按照记录返回最长子数组即可。原创 2023-03-11 19:37:21 · 77 阅读 · 0 评论 -
LeetCode-1590-使数组和能被 P 整除
我们假设当前数组之和对于 p 的余数是 x ,若 x == 0 说明此时刚好整除,我们直接返回 0。否则我们需要进一步寻找数组中的子数组,考虑到删除子数组之后剩余数组对于 p 的余数是 0 ,因此子数组之和对于 p 的余数应当为 x。我们可以利用哈希表来储存每个前缀的和与 p 的取模值与第几个元素的前缀之间的映射关系。我们最终遍历整个数组,找到每个位置上的前缀和与总数组前缀和相等时的情况,并求得当前的最短距离,最终返回即可。原创 2023-03-10 23:59:18 · 90 阅读 · 0 评论 -
LeetCode-166-分数到小数
我们首先对特殊情况进行处理,对被除数为0的情况进行讨论,而后我们计算添加结果的符号。接着我们向最终结果中添加其整数部分,并通过判断是否整除来确定是否需要添加小数点,而后我们开始添加小数部分。在计算小数部分时,我们单独记录小数部分的字符串,并利用哈希表来记录每一个余数与对应的位置,值得注意的是,我们每次都将余数乘以十之后进行计算,从而确保我们每次都只添加一位。我们可以利用哈希表来判断我们在进行除法的时候是否出现相同的余数,若出现相同的余数则肯定会出现循环小数。原创 2023-02-27 16:57:33 · 88 阅读 · 1 评论 -
LeetCode-341-扁平化嵌套列表迭代器
本题实际上是在遍历一棵树,将每个节点上的值加入最后的数组中,并返回数组的指针。我们可以使用深度优先遍历通过递归来遍历整个嵌套数组。我们首先定义dfs函数,对于nestedList中的每一个元素,若为整数则直接加入最终的数组,否则直接递归调用构造函数新建指针进行扁平化处理。在构造函数中,我们只需要深度遍历整棵树,并将指针指向开头即可。对于next,我们只需要返回当前指针的下一个值即可。对于hasNext,我们只需要判断当前指针是否指向末尾即可。原创 2023-02-25 11:17:15 · 196 阅读 · 0 评论 -
LeetCode-140-单词拆分 II
我们首先根据给定的wordDict生成对应的哈希集合。而后我们开始进行深度优先搜索:1、若当前搜索的位置抵达字符串的末尾,我们将该位置对应的字符串数组设置为空并返回;2、若我们当前搜索的位置在哈希表中并不存在,我们首先建立字符串数组,而后我们从当前位置开始向后探索,若此时生成的子串能够在哈希集合中找到,则我们继续对后续部分调用函数进行探索直至整个字符串探索完成,而后我们遍历下个位置i对应的字符串数组并将其加入当前结果中,并根据是否为空进行判断。我们可以使用回溯的方法来判断当前位置后的子串能否使用。原创 2023-02-24 17:10:13 · 77 阅读 · 0 评论 -
LeetCode-138-复制带随机指针的链表
我们可以递归调用函数copyRandomList来给我们复制节点的next和random指针指向对象。同时为了确保原节点和复制节点之间的对应关系,我们使用哈希表进行记录。原创 2023-02-23 13:04:19 · 119 阅读 · 0 评论 -
LeetCode-131-分割回文串
我们可以利用深度优先搜索,每次假设字符串中[0,i]的位置已经都是回文串,我们只需要继续判断当前连续的回文串的下一个位置[i,j]即可。同时为了加快回文串的判断,我们使用数组dp保存当前区间的字符串是否为回文串。int。原创 2023-02-22 22:57:48 · 114 阅读 · 0 评论 -
LeetCode-1140-石子游戏 II
我们可以利用数组dp[i][j]记录当前剩余i堆石子时,M为j时能获得的最大石子数。考虑到每个人采用的都是最优策略,且我们前面的行动会受到后续结果的影响,故我们从后向前进行遍历,统计当前剩余的石子数,并假设对方每次都能够采取最佳行动获得最大石子数。原创 2023-02-22 14:57:20 · 156 阅读 · 0 评论 -
LeetCode-395-至少有 K 个重复字符的最长子串
我们首先对字符串中每个字母出现的次数进行统计,显然出现次数小于k的字母是肯定不会出现在最终的字符串中的。因此我们可以使用分治法,根据这些肯定不会出现的字母对字符串进行划分,并利用递归求解出现字符串的最大长度。原创 2023-02-21 22:42:10 · 81 阅读 · 0 评论 -
LeetCode-1326-灌溉花园的最少水龙头数目
我们利用数组rightMost[n]记录以节点n为左端点的子区间中最远右端点的位置。而后我们对每个节点i进行判断,记左端点不超过i的所有子区间中右端点的最远位置为last,利用pre记录在上一个子区间的结束位置。每当我们抵达新位置i时,都对last进行更新:1、若last=i,说明下个位置无法覆盖,返回-1;2、若pre=i,说明我们使用完当前子区间,我们更新pre并将子区间数加一。原创 2023-02-21 21:52:25 · 88 阅读 · 0 评论 -
LeetCode-295-数据流的中位数
我们可以使用一个大顶堆和小顶堆来实现O(1)时间内获得中位数。对于加入的每一个数字,我们将其放入大顶堆和小顶堆中,并动态维护确保大顶堆和小顶堆的堆顶元素一定是数组中间的两个数字,而且大顶堆始终大于等于小顶堆。我们在添加元素时,若大顶堆为空或添加元素小于大顶堆的堆顶元素,则将新元素加入大顶堆中,而后我们判断此时大顶堆的大小是否大于小顶堆的大小加1,若是则我们将此时大顶堆中的堆顶元素加入小顶堆中;原创 2023-02-20 19:37:49 · 100 阅读 · 0 评论