友情支持
如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜
| 
 | 
 | 
有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

| 公众号的微信号是: jikerizhi。因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。 | 
2025年03月 刷题日志
| 序号 | 题目 | 题解 | 备注 | 
|---|---|---|---|
| 1 | ⭕️ 递归解法非常妙!传一个参数, | ||
| 2 | ✅ 思考清楚确定边界时,中间指针的移动方向即可迎刃而解。 | ||
| 3 | ⭕️ 重点去处理有序部分,在有序部分内查找不到,则去另外一部分去查找。 | ||
| 4 | ✅ 对区间进行排序,然后快慢指针在当前数组上对其进行合并。 | ||
| 5 | ✅ 关注有序区间,确定目标值在有序区间内,则在有序区间查找;反之,则在另外一部分内查找。另外,通过移动一个指针即可避开重复元素。 | ||
| 6 | ✅ 注意审题!返回的是数组下标。 | ||
| 7 | ✅ 双指针 | ||
| 8 | ✅ 快慢指针 | ||
| 9 | ✅ 快慢指针 | ||
| 10 | ⭕️ 滑动窗口,一定注意细节的处理。 | ||
| 11 | ❌ 完全想不到单调栈! | ||
| 12 | ✅ Top K 问题,优先队列;桶排序 | ||
| 13 | ⭕️ 快速选择,想清楚边界情况! | ||
| 14 | ⭕️ 循环排序,看了答案,自己写出来了。 | ||
| 15 | ⭕️ 对顶堆,思路理解,写代码却有很多问题。 | ||
| 16 | ✅ 多路归并 | ||
| 17 | ✅ 广度优先搜索 | ||
| 18 | ⭕️ 深度优先搜索,注意处理负数情况 | ||
| 19 | ✅ 滑动窗口 | ||
| 20 | ✅ 链表前后指针操作 | ||
| 21 | ✅ 两种解法:递归+迭代 | ||
| 22 | ✅ 快速选择 | ||
| 23 | ✅ 分段递归反转,再拼接 | ||
| 24 | ✅ 前缀树,竟然一次通过 | ||
| 25 | ✅ 并查集,竟然一次通过 | ||
| 26 | ✅ 利用递归“降维” | ||
| 27 | ✅ 拓扑排序 | ||
| 28 | ⭕️ 动态规划。稀里糊涂就对了,还要对推演。另有更精妙的分治解法,抽空再尝试。 | ||
| 29 | ✅ | ||
| 30 | ✅ 有更高效的马拉车算法,抽空可以尝试一下。 | ||
| 31 | ⭕️ 重点关注有序部分,优先在有序部分查找,不在有序部分再去无序部分查找。注意判定有序部分的方法:  | ||
| 32 | ✅ 想尝试并查集,结果失败。还是沉岛大法好啊! | ||
| 33 | ✅ 回溯 | ||
| 34 | ✅ 更巧妙的解法是位运算,如果  | ||
| 35 | ✅  | ||
| 36 | ✅ 递归很简单,抽空再思考一下非递归形式。 | ||
| 37 | ✅ 分治 | ||
| 38 | ❌ 动态规划,多维度“物品”就无从下手,还要多练。 | ||
| 39 | ⭕️ 动态规划,完全背包问题 | ||
| 40 | ⭕️ 子集,需要注意重复元素的处理。现在用  | ||
| 41 | ✅ 子集。注意对比子集模式在处理子集和排列时的不同:①子集直接在结果中添加新子集;②排列则是将结果中的元素出队,添加新元素后,再入队。 | ||
| 42 | ✅ 遍历找最大差值 | ||
| 43 | ✅ 递归遍历查找目标节点,找到则返回,找不到则返回  | ||
| 44 | ✅ 链表反转 | ||
| 45 | ✅ 暴力破解。更有的解法是 KMP 算法、Boyer-Moore 算法、Sunday 算法等算法。 | ||
| 46 | ✅ 使用递归来推进层级。注意处理细节。另外,在“上”和“右”能覆盖“全部”(比如一行多列或者多行一列)时,才能在“下”之前根据长度返回。尝试了每段“读取”只剩一个的方案,不行,有很多意外情况要处理。 | ||
| 47 | ✅ 双指针 | ||
| 48 | ✅ 双指针+链表反正+链表合并 | ||
| 49 | ✅ 双指针+数学 | ||
| 50 | ✅ 双指针+虚拟头节点。使用虚拟头结点会省事好多。 | ||
| 51 | ✅ 回溯 | ||
| 52 | ✅ 动态规划 | ||
| 53 | ✅ 动态规划 | ||
| 54 | ✅ 动态规划 | ||
| 55 | ✅ 动态规划 | ||
| 56 | ✅ 动态规划+树 = 树形动态规划 | ||
| 57 | ❌ 看答案也一脸懵逼! | ||
| 58 | ❌ 把题目理解错了。处理后就是最简单的打家劫舍问题。 | ||
| 59 | ✅ 动态规划 | ||
| 60 | ✅ 动态规划 | ||
| 61 | ❌ 明知是回溯,但在处理当前节点时,总把当前和下一步混在一起。有思路,没写出代码。 | ||
| 62 | ✅ 动态规划。直接在原有矩阵上操作即可。 | ||
| 63 | ✅ 动态规划。从底向上比从上向底效率更高。 | ||
| 64 | ✅ 动态规划 | ||
| 65 | ⭕️ 动态规划。题目理解错误。 | ||
| 66 | ✅ 动态规划。直接将结果存储在参数矩阵上。如果正方形想扩大,则左边,左上和上面三个都是正方形时才可以,可以直接去这三者中的最小值。 | ||
| 67 | ⭕️ 回溯+备忘录。首先想到的是回溯,但是超时(通过34/47的测试用例)。参考别人题解后,得到启发,加上备忘录通过。参考答案写出了动态规划的解法。思考如何从基于回溯+备忘录转变为动态规划? | ||
| 68 | ✅ 回溯。没想到从  | ||
| 69 | ❌ 动态规划。相当于在“结尾”中寻找回文子串。从一维字符串字符坐标去看转移方程,会更加清楚明了。 | ||
| 70 | ✅ 双指针 | ||
| 71 | ✅ 快慢指针。慢指针记录满足条件的长度,快指针指向需要处理的元素。 | ||
| 72 | ❌ 使用单调栈没写出来。使用单调栈,需  | ||
| 73 | ✅ 动态规划。思考如何进一步优化成一维数组? | ||
| 74 | ⭕️ 添加虚拟节点的做法超时。看答案给节点加编号通过。 | ||
| 75 | ❌ 明白大概意思,思路不够条理,写不出代码。 | ||
| 76 | ❌ 题目理解错误,是轮转数组,不是旋转数组。 | ||
| 77 | ✅ 快慢指针。看答案,一个指针也可以!而且代码更简单! | ||
| 78 | ❌ 动态规划。这里求的是公共子数组,只能在两个字符相等时,在上一个字符的基础上加  | ||
| 79 | ✅ 动态规划。注意区分“子序列”和“子数组”的区别。 | ||
| 80 | ✅ 滑动窗口。没想到队列也能当滑动窗口。 | ||
| 81 | ✅ 回溯 | ||
| 82 | ❌ 并查集。通过邮箱编号建立连接,而不是通过账户索引建立连接。 | ||
| 83 | ⭕️ 最初思路是排序。看答案,可以构建集合,然后“起点”(没有前一个数字)数字开始统计。 | ||
| 84 | ✅ | ||
| 85 | ❌ 单调栈,与 316. Remove Duplicate Letters 相同。知道用单调栈,但还是没写出来。 | ||
| 86 | ❌ 动态规划。看答案也一脸懵逼! | ||
| 87 | ✅ 二叉树中根遍历。 | ||
| 88 | ⭕️ 回溯。找出所有的高峰和山谷,然后对高峰做排列,计算各种排列与山谷的距离,取最小值即可。有模糊思路,看答案才写出代码。 | ||
| 89 | ❌ 滑动窗口。要分情况处理窗口移动问题。 | ||
| 90 | ⭕️ 栈。使用栈记录左右括号的下标,匹配后标注“占位符”。最后,统计占位符中的数量,找出最大长度。 | ||
| 91 | ✅ 二分查找。把矩阵按行“拼接”,然后二分查找,解法非常妙。 | ||
| 92 | ❌ 单调栈。一脸懵逼。哨兵技巧非常巧妙。 | ||
| 93 | ⭕️ 栈。把  | ||
| 94 | ❌ 动态规划,0/1 背包问题。一脸懵逼。 | ||
| 95 | ⭕️ 回溯。学习使用位操作来标注已用字符,计算未用字符。位操作真是太玄妙了! | ||
| 96 | ✅ 回溯 | ||
| 97 | ✅ 回溯。注意同层剪枝的技巧。 | ||
| 98 | ✅ 使用递归来推进循环。 | ||
| 99 | ✅ 使用  | ||
| 100 | ✅ 前缀和。需要记录每一个和的出现次数。 | ||
| 101 | ✅ 二分查找。使用一个单独变量来保存最后一个小于等于的中间值,那么即可直接获取答案。 | ||
| 102 | ✅ 有差价就买卖,见好就收。 | ||
| 103 | ✅ 双指针 | ||
| 104 | ✅ 位运算。出现两次,则异或后为  | ||
| 105 | ✅ 贪心算法。优先禁止最近的对方议员投票。不停循环,直到只留下一方议员。 | ||
| 106 | ✅ 贪心算法。最高位尽可能跟后面的最大数字进行交换。 | ||
| 107 | ✅ 双指针 | ||
| 108 | ✅ | ||
| 109 | ✅ 前缀树。需要处理通配符的情况,尤其要注意结尾字符的处理。 | ||
| 110 | ✅ 回溯 | ||
| 111 | ❌ 使用双栈来分别存放数字和操作符。 | ||
| 112 | ✅ 单调栈。有很多细节需要考虑。 | ||
| 113 | ⭕️ 在 136. 只出现一次的数字 基础上,做了进一步延伸。需要先根据所有数异或值的最后一位  | ||
| 114 | ❌ 位运算。按位统计  | ||
| 115 | ❌ 动态规划。 | ||
| 116 | ⭕️ 还有瑕疵,还需要继续优化。 | ||
| 117 | ❌ 前缀和。想到了前缀和,但是没想到可以利用中间和为  | ||
| 118 | ❌ 动态规划。思路还需要多揣摩和思考。 | ||
| 119 | ✅ 深度优先遍历。按照  | ||
| 120 | ✅ 动态规划。也可以使用深度优先搜索的解法,使用深度优先搜索时,需要把处理过的节点值设置为  | ||
| 121 | ⭕️ 深度优先搜索通过 48 / 56 个测试用例。使用带备忘录的深度优先搜索顺利通过。带备忘录的深度优先搜索,也可以优化成动态规划。 | ||
| 122 | ✅ 总结提炼判断规则。 | ||
| 123 | ✅ 数学计算 | ||
| 124 | ❌ 动态规划。动态规划+二分查找的解法一脸懵逼,看答案都懵逼! | ||
| 125 | ✅ 树的 Morris 遍历 | ||
| 126 | ✅ 质数判断 | ||
| 127 | ✅ 使用开放地址法解决哈希冲突。 | ||
| 128 | ❌ 先求三个字符串的全排列,然后合并(合并时注意处理首尾相同子串,减少合并字符串的长度),在这些合并后的字符串中选择最短,字典排序最小的字符串。 | ||
| 129 | ❌ 先只考虑一边的情况,再组合两边的情况。只考虑一边的情况,就是一个斐波那契数列: \(f(i) = f(i-1) + f(i-2)\)。 | ||
| 130 | ✅ 最简单的解法双重循环。取巧的解法是,利用“前缀和”的思路,分别计算当前节点左右两侧的操作次数,然后再相加。 | ||
| 131 | ✅ 最初思路是对两个数组统计次数。其实只需要对一个数组统计次数,另外一个数组遍历时就可以求交集了。 | ||
| 132 | ✅ 双指针 | ||
| 133 | ✅ 回文 | ||
| 134 | ✅ 滑动窗口。题目不难,只是处理边界条件麻烦。另外,也有取巧解法,可以探索一下。 | ||
| 135 | ❌ 理解错题目了。前大,中小,后大,这类子数组也可以产生更多的子数组和。另有“取反”和单调栈解法。 | ||
| 136 | ❌ 回溯解法通过 50 / 57 个测试用例。动态规划解法太难了! | ||
| 137 | ✅ 腐烂加剧+传染。广度优先遍历的解法也挺有意思。 | ||
| 138 | ✅ 解法很多,可以很好地开阔思路! | ||
| 139 | ✅ 回溯。也可以去掉回溯过程,使用深度优先遍历。 | ||
| 140 | ✅ 链表。增加虚拟节点,极大简化代码。 | ||
| 141 | ✅ 双指针 | ||
| 142 | ✅ 贪心算法。也可以动态规划。 | ||
| 143 | ✅ 双指针,同时需要记录每个元素的次数,相同元素只复制两个。 | ||
| 144 | ✅ 贪心算法。没想到这就是贪心? | ||
| 145 | ✅ 快慢指针。 | ||
| 146 | ✅ 链表操作 | ||
| 147 | ❌ 动态规划。递推公式还要仔细推敲。 | ||
| 148 | ✅ 遍历对角线设置成负值,检查其他元素,发现有大于  | ||
| 149 | ✅ 哈希 | ||
| 150 | ✅ 贪心。从左边界开始,尽可能多占用横轴。宽度耗尽,则从下一个点开始。 | ||
| 151 | ✅ 贪心。转变一下题目就是要求如何缩短最大值和最小值直接的差值。看官方题解,可以直接求 \(a(n - 4 + i) - a(i)\) 的最小值。 | ||
| 152 | ✅ | ||
| 153 | ✅ 回溯,深度优先遍历,到叶子节点判断是否可以组成回文。 | ||
| 154 | ✅ 哈希 + 字符串 | ||
| 155 | ✅ 贪心。每次去第二大的数字即可。 | ||
| 156 | ✅ 深度优先遍历,在“后序”中做业务处理。 | ||
| 157 | ❌ 题目理解错误! | ||
| 158 | ✅ 栈。代码写出来了,但是好烂! | ||
| 159 | ✅ 深度优先遍历或广度优先遍历。 | ||
| 160 | ✅ 映射。建立一个字母映射,并且每个字母只能有一种映射关系。否则就不匹配。 | ||
| 161 | ✅ 先计算没有生气而满意的总数,再计算因为老板憋气而满意的增量用户。 | ||
| 162 | ✅ 分类讨论 | ||
| 163 | ✅ 深度优先遍历。有机会尝试一下广度优先遍历。 | ||
| 164 | ✅ 深度优先遍历。 | ||
| 165 | ✅ 两遍遍历。有题解可以不到一遍遍历即可解决问题。 | ||
| 166 | ✅ 先计算每个数字的权重,再进行比较:使用集合存储下标,通过下标找到对应的权重。计算权重时,可以递归,也可以直接循环。使用递归时,可以使用备忘录把已经计算的值存储起来,防止重复计算。 | ||
| 167 | ✅ 想找个巧办法,结果失败!还是用记录轨迹的办法搞定了。 | ||
| 168 | ✅ 深度优先遍历,把父节点传到递归参数里,同时标注一下是左子树还是右子树。 | ||
| 169 | ⭕️ 前缀和。使用官方题解中的异或前缀和解法啦。数学知识还是得补啊!原来的思路是回溯,通过 46 / 47 测试用例。使用回溯应该对,但是加上备忘录后,还是有一个测试用例没通过。(看一个题解,原始解法就是暴力法。是对的。) | ||
| 170 | ⭕️ 统计奇数字母个数,如果个数超过  | ||
| 171 | ✅ 使用属性  | ||
| 172 | ✅ 我的解法是从两边向中间挤压;更优解是找到平方根,然后向外开。 | ||
| 173 | ✅ 深度优先遍历,递归,在“后序”阶段处理业务逻辑。 | ||
| 174 | ✅ 双指针 | ||
| 175 | ✅ 二叉搜索树,先中序遍历拿到所有节点,然后递归构造平衡二叉搜索树。 | ||
| 176 | ✅ 统计每个数字的下标,然后逐个检查每个数字的下标集合是否能完整覆盖原始数字的全部下标。更优解:判断是否可以都变成  | ||
| 177 | ✅ 暴力解法:对重复的相邻字母计数,当计数达到 k 时将其删除。重复此操作,直到没有删除的字符为止。通过 19 / 21 个测试用例。更优解:把当前字符的次数存下来,下一个字符就可以在当前字符基础上做处理,省去重复计算。官方题解提供了多种解法,非常优秀! | ||
| 178 | ✅ 双指针。先排除两种没有交集的情况,剩下四种有交集的情况,左边选两个里面最大的,右边选两个里面最小的。哪个小,向右移动哪个的指针。 | ||
| 179 | ✅ 找到每一层的左右端点的值,确认所求数值在本层中的下标(从  | ||
| 180 | ✅ 右子树肯定比左子树的最大值还要大,所以,可以直接把右子树直接挂在左子树的右子树上。然后,把左子树挂在右子树的指针上,当前节点向右移动一下,继续上面的操作。 | ||
| 181 | ✅ 在上一层构建下一层的连接。由于存在空节点,要在运动中找“最左节点”和“前一个节点”。 | ||
| 182 | ✅ DFS+哈希。本想通过修改原始节点值,省去哈希,但是由于有环,存在循环依赖,没办法省掉。 | ||
| 183 | ✅ 看其他题解是贪心算法。我的解法感觉是遍历,不知道算不算贪心。 | ||
| 184 | ⭕️ 初步设想是一次遍历。后来看题解,可以从两端遍历,再就和。这样可以省去很多判断。 | ||
| 185 | ⭕️ 通过计算 \((y_1 - y_2) / (x_1 - x_2) = (y_2 - y_3)/(x_2 - x_3)\) 即可确定三个点是否在同一个直线上。 | ||
| 186 | ✅ 遇到数字就入栈,遇到运算符号就将栈顶元素出栈,计算完成后再入栈。 | ||
| 187 | ✅ 双指针,切割对调。 | ||
| 188 | ✅ 二分查找!只要聚焦于最低点所在局域即可。其他区域可以忽略。 | ||
| 189 | ✅ 栈。使用栈模拟递归调用。 | ||
| 190 | ⭕️ 位运算!暴力解法超时!可以利用 \(n&(n-1)\) 去掉  | ||
| 191 | ⭕️ 回溯,通过 43 / 65 个测试用例,后超时。利用前缀树+回溯,可以避免重复判断单词相同的前缀部分,可以节省大量的计算。 | ||
| 192 | ✅ 使用哈希存每个数字的最后坐标,遇到相同就判断是否满足条件,否则继续推进。看题解,只保存滑动窗口范围内的数字,可以更节省内存! | ||
| 193 | ✅ 双指针:一个指针记录起始位置,一个指针向前推进,有起始则区间加入,没有则单独加入。 | ||
| 194 | ✅ 排序,从后向前,假如当前数字大于  | ||
| 195 | ✅ 哈希,从字符串截取单词,跟  | ||
| 196 | ✅ 使用优先队列,存放最小的  | ||
| 197 | ✅ 先统计  | ||
| 198 | ❌ 将代数式翻译成代码,完全没有思路!一脸懵逼!直接抄的官方题解! | ||
| 199 | ✅ 递归+分治。注意:一个区域内是否相等不能靠底层的节点来判断,需要遍历所有的节点值。 | ||
| 200 | ⭕️ 广度优先遍历。原来会的类型,好久不做,都快忘完了! | ||
| 201 | ✅ 对坐标区间排序,然后进行区间合并,最后统计只剩几个区间即可。看题解,也不需要保存区间,只需要记录最后一个区间的右端就可以统计出区间数量。也有一个类似的贪心思路解法。 | ||
| 202 | ⭕️ 贪心+大顶堆。每次都在可选的范围内,盈利最大的!通过 35 / 40 个测试用例,超时!有思路,可惜没想好怎么写代码! | ||
| 203 | ✅ 广度优先遍历。先构建坐标到数字和数字到坐标的对应关系,然后通过入队出队尝试每一步,直到终点或者不可达。使用移位将坐标转换成一个数字,在一个  | ||
| 204 | ✅ 对行、列和块三部分分别判断是否含有重复数字即可。不是求解,只是合法性判断! | ||
| 205 | ✅ 回溯!做 36. 有效的数独 时,当做“解数独”来做了。一做两题了! | ||
| 206 | ✅ 回溯!有机会尝试一下位运算!看题解,不需要构建矩阵也可以模拟棋盘。 | ||
| 207 | ❌ 有思路,但是没有对思路进行分类。参考题解,分为“最后一行”、“一个单词一行”和“多个单词一行”来分别处理。 | ||
| 208 | ❌ 动态规划。思考  | ||
| 209 | ❌ 动态规划。尝试双指针失败!完全没有想到可以用动态规划来解决这个问题! | ||
| 210 | ❌ 单调栈!计算每一行的高度,然后利用这个高度,使用与 84. 柱状图中最大的矩形 中相同的思路,结合单调栈的模式来解决问题。多种解法,还有动态规划的解法。 | ||
| 211 | ✅ 链表操作。📢:只有当前节点比前驱节点大时,才向后 移动指针。否则,无需移动指针。 | ||
| 212 | ✅ 双指针。一个指针指向一个字符串下标,从指针位置取一个修订号的值,然后比较,再取下一个修订号。 | ||
| 213 | ✅ 进制转换!虽然最终做出来了,但掌握的还是不够透彻! | ||
| 214 | ✅ 动态规划!从终点向起始位置反推。遇到正数就直接加,遇到负数则先看看上一步的最大值是正数还是负数,是负数则需要累加,是正数则舍弃,直接从当前位置的负数算起。 | ||
| 215 | ✅ 使用比特位表示每个数字!这样统计每个比特位之间的差值即可。更优解是基数排序,抽空学习一下。 | ||
| 216 | ✅ 暴力法,通过 30/31 个测试用例。使用子串+哈希优化一下即可。看题解,还有滑动窗口,有机会学习一下。 | ||
| 217 | ✅ 以为是算法题,没想到是 Bash 脚本编程题! | ||
| 218 | ✅ 反转字符串,选择反转字符串结尾和原始字符串开头相同部分,再截取前缀+原始字符串即可获得答案!通过 124 / 126 个测试用例。使用  | ||
| 219 | ✅ 最简单的解法是排序。时间复杂度更优的解答是哈希计数。 | ||
| 220 | ⭕️ 原本还想按分离,包含和相交三种情况来处理,相交情况太多,放弃!容斥原理的处理手段和 Merge Intervals 区间合并 题目的方式类似! | ||
| 221 | ✅ 就是用两个队列来回倒腾。添加元素的时候,哪个空就放那个队列中,把另外一个队列里的值都倒腾过来。 | ||
| 222 | ⭕️ 最简单解法是哈希计数法。更精美的解法是摩尔投票法,通过抵消不同元素的出现次数,最后剩余下的元素可能就是符合要求元素。 | ||
| 223 | ❌ 看完题目首先想的是怎么插入括号。看了题解,可以按运算符将左右分为两部分进行递归求解,再分别对左右进行计算。 | ||
| 224 | ✅ 数学计算。 | ||
| 225 | ✅ 数学计算。 | ||
| 226 | ✅ 优先队列 | ||
| 227 | ✅ 二分查找 | ||
| 228 | ⭕️ 回溯!对切分的数字和运算符进行遍历。想到了思路,实现出了问题。 | ||
| 229 | ✅ 调用  | ||
| 230 | ✅ 数学推理。 | ||
| 231 | ✅ 深度优先搜索。逐步截取字符串,累加,向后推进。题解都叫回溯,D瓜哥这里没有回溯的操作,只使用了深度优先搜索。 | ||
| 232 | ⭕️ 优化前:深度优先遍历,通过 68 / 71 测试用例,超时。看题解,使用从外向内靠拢的广度优先遍历解法解决了这个问题。网友称之为剪窗花思路。 | ||
| 233 | ✅ 优先队列。从优先队列中取出最小的数与给定的质数数组元素相乘,生成后续的丑数。 | ||
| 234 | ✅ 计算每一个单词的字母占用情况,然后逐个比较,没有相同字母,则计算单词长度乘积,最后取最大值返回即可。 | ||
| 235 | ⭕️ 优化前:模拟开灯过程,通过 33 / 35 测试用例,超时。看题解,没想到竟然是找  | ||
| 236 | ✅ 数学题,也可以说是比特位题。 | ||
| 237 | ✅ 双指针!从字符串两端寻找元音字符,然后进行交换。注意大小写! | ||
| 238 | ✅ 排序+双指针!也可以使用  | ||
| 239 | ✅ 利用列表存储,来维持前后顺序;或者,增加时间戳字段。 | ||
| 240 | ✅ 数学题。排列组合。 | ||
| 241 | ❌ 深度优先遍历、广度优先遍历或数学(贝祖定理)。这道题重点是如何抽象倒水壶的表示办法以及梳理清楚存在几种可能的操作。 | ||
| 242 | ✅ 二分查找。需要注意处理平方溢出的情况。 | ||
| 243 | ❌ 动态规划!将这个问题转换成最长子序列的思路,以及代码写法非常值得学习! | ||
| 244 | ⭕️ 数学计算+分治算法。重点是要搞清楚,两个数字相乘求模,等于分别对两个数求模,相乘然后再求模。基本思路搞明白了,数学计算处理错了。 | ||
| 245 | ✅ 二分查找。 | ||
| 246 | ❌ 贪心算法。一脸懵逼,看答案才懂。 | ||
| 247 | ❌ 动态规划 - 完全背包问题。起初以为是回溯,没想到是完全背包问题。 | ||
| 248 | ✅ 转数组或随机选数从头找选中的节点。感觉蓄水池抽样算法不让直接随机选择数字向后遍历效率高。 | ||
| 249 | ✅ 哈希或异或。 | ||
| 250 | ✅ 位运算 | ||
| 251 | ⭕️ 暴力破解,模拟整个计算过程来求结果,通过 45 / 58 个测试用例,超时。 | ||
| 252 | ✅ 深度优先搜索!计算每一个转换,在每一步中取最小值,即可得到结果。 | ||
| 253 | ✅ 哈希或蓄水池抽样算法。 | ||
| 254 | ✅ 回溯或位操作。小时数和分钟数都有上限,这点需注意! | ||
| 255 | ✅ 位运算。可以直接转换成十六进制,不需要从二进制绕一下。 | ||
| 256 | ✅ 选择一个元素做起点,向前探索可以成为等差数组的可能。竟然可以用滑动窗口! | ||
| 257 | ✅ 竟然可以使用三个变量来保存第一、二、三大数。这样,遍历一遍即可得到这三个数字。 | ||
| 258 | ⭕️ 题目有点不明觉厉!搞清楚题目要求,就是一个 DFS 或 BFS:分别以靠着海洋的点为起点,找出“步步高升”的点,最后求两个海洋的高点交集。 | ||
| 259 | ✅ 修改矩阵的解法很简单!不修改矩阵且时间复杂度是 \(O(1)\),写代码就有点技巧:遇到第一个战舰计数,当上一个节点或者做一个节点也是战舰时,就跳过! | ||
| 260 | ⭕️ 按照最初想法,先统计每个字符出现的次数,然后再按照数字顺序,逐个去尝试是否在字符串中。这样时间复杂度就不可控。看题解,可以按照单词中的字符出现特性,先将只出现在一个数字中的字符挑选出来,确定对应的数字出现次数。然后,在处理出现中两个数字中的字符,逐步把所有数字出现次数确定好。 | ||
| 261 | ✅ 识别单词开头,进行数量统计。 | ||
| 262 | ⭕️ 一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。 | ||
| 263 | ❌ 前缀树或哈希!这道题可以换个思路来理解:选出两个数,小数正好可以“补齐”大数尽可能高位的  | ||
| 264 | ❌ 滑动窗口。难点在于,如何判断一个字符串改变 K 个字符,能够变成一个连续串? | ||
| 265 | ⭕️ 深度优先遍历。思路有,但是代码写不出来!还是得多练!逐个元素处理,遇到有子元素的情况,则“向下”一层,将下一层做扁平化处理。 | ||
| 266 | ✅ 二分查找或数学。一元二次方程求根公式。 | ||
| 267 | ❌ 贪心算法。换个角度,改为计算最多可以选多少个互不重叠的区间。 | ||
| 268 | ❌ 排序+二分查找。由于左端点都不同,可以根据左端点的值来来对区间进行排序。然后在这个有序序列中,查找右端点的“最近左端点”。 | ||
| 269 | ⭕️ Cyclic Sort 循环排序。想到了排序的思路,但是把“循环排序”的模式给忘记了,更没有把具体步骤没有理清楚。 | ||
| 270 | ✅ 双指针。一个指针  | ||
| 271 | ✅ 将链表以短链表的长度为准分割成收尾两部分,尾部相加,再“嫁接”到截取下来的首部。 | ||
| 272 | ⭕️ 暴力破解。通过 25/32 个测试用例。利用排列组合原理也优化,统计相同距离的点数,组成的回旋镖需要两个点,则数量为:\(A_{n}^{2}=\frac{n!}{(n-2)!} = n(n-1)\)。 | ||
| 273 | ✅ 先统计再排序。注意:如果两个字符的数量相等时,还需要根据自身的自然顺序排序,否则就会被  | ||
| 274 | ✅ 排序+双指+可选的贪心。 | ||
| 275 | ✅ 使用回溯,对每一个元素做深度优先遍历。遇到环形数组则返回,否则继续向前遍历,直到结束。优化:遍历过的节点肯定不是环形数组,遇到遍历过的节点,直接“返回 false”,这样,所有节点只需要出来一次,时间复杂度 \(O(n)\)。 | ||
| 276 | ❌ 单调栈!完全没想到单调栈的解法!从右向左遍历,使用一个单调递减栈,来维护  | ||
| 277 | ✅ 对字符串进行以  | ||
| 278 | ❌ 太难了! | ||
| 279 | ✅ 数学。求一个数的二进制中  | ||
| 280 | ✅ 深度优先或者广度优先。 | ||
| 281 | ✅ 字符串操作,规则判断,没意思。 | ||
| 282 | ✅ 数学。拒绝采样。蒙对了。调用 10 次,生成  | ||
| 283 | ❌ 回溯。有思路,没代码。“从边到火柴”,还是“从火柴到边”? | ||
| 284 | ❌ 二分查找。对加热器排序,对每一个房子寻找左侧最近的加热器,然后计算两侧加热器哪个最近?对于所有房子来说,做大的最近距离就能满足所有房子的加热需求。 | ||
| 285 | ✅ 数学。位运算。 | ||
| 286 | ✅ 数学。位运算。通过求所有数字在一个指定比特位上的  | ||
| 287 | ✅ 数学。拒绝采样。利用图像平移,在  | ||
| 288 | ❌ 双指针。但感觉有数学的感觉。有大概思路,忽略了  | ||
| 289 | ✅ 字符串。从后向前,遍历字符串。 | ||
| 290 | ✅ Plus专题。复习 Difference Array 差分数组 | ||
| 291 | |||
| 292 | ✅ 复习 Prefix Sum 前缀和 | ||
| 293 | ✅ 二分查找。寻找边界时,找左收右,找右收左。 | ||
| 294 | ❌ 二分查找。先在有序部分内查找,找不到则去另外一部分去查找。重点是识别出哪部分是有序部分。还想到一个思路:先找拐点,再分段去查找,代码各种问题。没有完全写对。 | ||
| 295 | |||
| 296 | ✅ 复习 Fast & Slow Pointers 快慢指针。不比拘泥于快慢指针;也不比拘泥于一层循环,嵌套的内层循环向前推进,也会带动外层循环向前推进。 | ||
| 297 | ✅ 复习 Merge Intervals 区间合并。对区间进行排序,然后快慢指针在当前数组上对其进行合并。 | ||
| 298 | ✅ 复习 Two Pointer 双指针。双指针+递归降维。 | ||
| 299 | ✅ 复习 Sliding Window 滑动窗口。我采用的是计数法,也可以采用地址法。 | ||
| 300 | ❌ 复习 Monotonic Stack 单调栈。知道是单调栈,代码还是没写出来!看到题解,又里面秒懂。 | ||
| 301 | ⭕️ 单调栈。利用单调递增栈,将“当前元素”前面更大的元素都删除掉,这样就可以实现尽可能大的减小这个数字。如果数字是递增的,那么就从后面向前删除,直到删够为止。 | ||
| 302 | ✅ Top K 问题,优先队列;桶排序;也可以利用快速选择。 | ||
| 303 | ⭕️ 快速选择。有思路,但代码总报错!还需要多练! | ||
| 304 | ✅ 循环排序。 | ||
| 305 | ✅ 对顶堆。每次添加,都要在两个堆之间倒腾一下,这样才能保证,小的沉下去,大的升上去。 | ||
| 306 | ⭕️ 滑动窗口+对顶堆。单纯利用对顶堆,只能通过 43 / 44 个测试用例。延迟删除的实现有些复杂,还要再研究一下。 | ||
| 307 | ✅ 多路归并的解法。 | ||
| 308 | ✅ 广度优先搜索或深度优先搜索。这次尝试使用广度优先搜索+遍历来解决问题。 | ||
| 309 | ⭕️ 深度优先遍历 + 乘法原理。有思路,代码没写利索。这道题还可以使用并查集来解决。 | ||
| 310 | ✅ 前缀树。 | ||
| 311 | ✅ 并查集,将式子分为两类,添加等式,查询不等式,相连就报错。 | ||
| 312 | ✅ 拓扑排序。基础款,只需要找出入度为  | ||
| 313 | ✅ 拓扑排序。在拓扑排序的基础上,对起点和涉及到的点做了限制。 | ||
| 314 | ✅ Decrease and Conquer 减治法。在出现重复时,将后面的账户加入到前面账户。 | ||
| 315 | ⭕️ 数学计算+分治算法。重点是要搞清楚,两个数字相乘求模,等于分别对两个数求模,相乘然后再求模。最开始的想法把复杂度搞错了。通过  | ||
| 316 | ✅ 回溯。 | ||
| 317 | ✅ 回溯+前缀和。利用回溯,遍历所有节点;利用前缀和,来避免重复计算。 | ||
| 318 | ✅ 复习 Subsets 子集。尝试子集模式的解法。有重复元素,利用  | ||
| 319 | ✅ 动态规划。恰当的计算顺序对算法的实现也至关重要! | ||
| 320 | ❌ 动态规划。还是爬楼梯! | ||
| 321 | ✅ 动态规划。从两端开始抢劫,最后剩余一个不抢。或者从第一抢到倒数第二个,或从第二个抢到最后一个。 | ||
| 322 | ✅ 动态规划。\(f(x)\) 表示从  | ||
| 323 | ✅ 动态规划。利用后两个参数加字母表,可以求出每个字母对应的价值。其余就是一个“最大子数组和”,直接利用 Kadane 算法即可。 | ||
| 324 | ✅ 动态规划。状态转移可以视作在网格图上的移动。 | ||
| 325 | ✅ 动态规划。注意:是从左向右移动,不是从上向下移动。 | ||
| 326 | ❌ 动态规划。0/1 背包问题,有个大概思路,但是还不完善,代码也没写出来。 | ||
| 327 | ✅ 动态规划。完全背包问题。 | ||
| 328 | ⭕️ 动态规划。有了大概思路,在思考递推公式时,搞错了。 \(dp[r][c]\) 除了从 \(dp[r-1][c-1]+1\) 来增大,还可以从 \(dp[r-1][c]\) 或 \(dp[r][c-1]\) 找找出最大值来继承。 | ||
| 329 | ⭕️ 动态规划。可以通过 \(sum = positive + negative\) 和 \(target = positive - negative\) 解方程可以得到 \(positive = (sum + target) / 2\) 和 \(negative = (sum - target) / 2\)。那么,只需要从数字数组中挑选出一些元素使其等于  | ||
| 330 | ⭕️ 动态规划。对比 0/1 Knapsack 0/1 背包 与 Unbounded Knapsack 完全背包 的差异,验证 0/1 背包如何通过逆序遍历来解题。 | ||
| 331 | ✅ 动态规划。对比 0/1 Knapsack 0/1 背包 与 Unbounded Knapsack 完全背包 的差异,验证完全背包如何通过正序遍历来解题。 | ||
| 332 | ⭕️ 动态规划。用一维数组完成没问题;重现二维递推过程,懵逼了!还是得多想多练。 | ||
| 333 | ✅ 广度优先遍历。两种做法:①腐烂加深,从  | ||
| 334 | ✅ 区间合并。把有重叠的区间全部合并成一个大区间即可。 | ||
| 335 | ✅ 单调栈。从后向前,如果栈顶元素小于等于当前元素,则弹出。如果栈不为空,则栈顶元素就是比当前元素大的最近的元素。 | ||
| 336 | ✅ 前缀和。由于有负数,使用双指针+滑动窗口无法缩放窗口的大小,所以,无法使用双指针。只能使用前缀和。需求在计数器里放一个前缀和为  | ||
| 337 | ✅ 深度优先遍历。这道题求解的是“路径长度”,不是节点数量。理解这一点,就能理解当节点为  | ||
| 338 | ✅ 滑动窗口。 | ||
| 339 | ✅ 回溯+前缀和。利用回溯,遍历所有节点;利用前缀和,来避免重复计算。加一个  | ||
| 340 | ✅ 动态规划。0/1 背包问题。直接上空间压缩的解法。 | ||
| 341 | ✅ 使用递归模拟栈。递归一次,降维一层。 | ||
| 342 | ⭕️ Top K 问题,优先队列,桶排序和快速选择。尝试快速选择,思路有,代码总报错。最后,无奈选择桶排序。 | ||
| 343 | ⭕️ 动态规划。从原始数组克隆出一个去重后再排序的新数组,利用 1143. 最长公共子序列 来求解。题目解出来了,还要学习一下更标准的解法。 | ||
| 344 | ✅ 对顶堆。每次添加,都要在两个堆之间倒腾一下,保证小的沉下去,大的升上去。 | ||
| 345 | ✅ 滑动窗口+对顶堆。在对顶堆的基础上,加上延迟删除技巧。所谓延迟删除技巧,就是只删除堆顶。这样,就不用耗时去堆里遍历查找要删除的元素。 | ||
| 346 | ⭕️ 快慢指针。利用 142. 环形链表 II^ 思路,将数组转换成一个找链表环的入口来解决。有机会试试循环排序的解法。 | ||
| 347 | ✅ 快慢指针。看题解,本地栈解法更简洁。 | ||
| 348 | ❌ 动态规划。完全背包问题。脑子里还是一堆浆糊,还是得练! | ||
| 349 | ❌ 双指针或贪心(看法各异)。不要有序就强上二分查找。观察矩阵,右上角和左下角的元素有代表性:根据大小,可以删除左边一列(大于等于右上角元素)或上一行(小于等于右上角元素),或者下面一行(大于等于左上角元素)或坐标一列(小于等于左下角元素)。可以根据这个规律,来排查不符合条件的元素。 | ||
| 350 | ✅ 单调递减栈。把小的数字逐步弹出,只留下大的。如果滑出窗口,则把最底下的元素删除。 | ||
| 351 | ✅ 前缀和。利用前缀和的思路,分别求前缀乘积和后缀乘积,然后再逐个求每个元素的前后元素乘积。利用结果数组存前缀乘积,可以将空间复杂度降低到常数级。 | ||
| 352 | ✅ 深度优先遍历。找到或者到叶子节点就“触底反弹”,在“后根遍历”的位置处理递归调用的结果,分属左右子树则返回“当前根节点”,否则谁不为空返回谁。 | ||
| 353 | ✅ 快慢指针。使用快慢指针找到中间节点,翻转后半部分,再和前半部分比较即可。 | ||
| 354 | ✅ DFS + 树。递归方式OK,迭代方式还要再体会一下。 | ||
| 355 | ✅ 深度优先遍历。可以不用  | ||
| 356 | ✅ 深度优先遍历或广度优先遍历。先递归再交换,或者先交换再递归。 | ||
| 357 | ✅ 双指针。分成两段,分别首尾对调,再整体首尾对调。 | ||
| 358 | ✅ 动态规划。如果利用数组,则需要修正  | 
截止目前,本轮练习一共完成 358 道题。

