
hot100系列[完更]
文章平均质量分 65
leetcode hot100
SrmaticHai_NEU_J
为天地立心,为生民立命,为往圣继绝学,为万世开太平
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
面试高频题单/hot100精华(倒背如流)
哈希003-128 最长连续序列滑动窗口008-003 无重复字符的最长子串子串010-560 和为K的子数组 前缀和普通数组017-041 缺失的第一个正数014-056 合并区间矩阵链表035-146 LRU缓存 3二叉树050-124二叉树的最大路径和 hard041-102 二叉树的层序遍历048-437 路径总和Ⅲ 前缀和图论051-200 岛屿数量 回溯060-079 单词搜索(矩阵 图论 dfs 回溯)二分查找066-033 搜索旋转排序数组栈069-20 有效的括号堆贪心动态规划086-13原创 2025-07-07 06:56:53 · 182 阅读 · 0 评论 -
100-287 寻找重复数
在“寻找重复数”的问题中,通过使用快慢指针找到环的存在和环的入口,利用了快指针比慢指针移动更快的特性。由于数字范围是1到n,我们可以把数组的元素看作指向数组下标的指针,这样数组就可以看作一个链表,而重复的数字就相当于链表中的环。比如,如果 nums[fast] = k,那么数组中的第 fast 个元素指向数组的第 k 个元素。这个问题要求在一个长度为n+1的数组中,找出唯一的一个重复数,且数组中的数字范围是1到n。是“快慢指针”法中的关键一步,表示“快指针”每次移动两步。返回环的入口,即重复的数字。原创 2025-07-20 21:01:00 · 631 阅读 · 0 评论 -
099-031 下一个排列
在找到需要交换的两个元素并交换之后,i之后的部分仍然是从右向左的降序排列(因为在最初的扫描中,我们找到了第一个不满足降序的元素)。为了获得字典序中的最小下一个排列,我们必须将i之后的部分变成升序排列,这样才能保证这是紧接当前排列的下一个最小的排列。如果不进行反转,生成的排列可能并不是字典序中紧邻当前排列的下一个排列。这个算法的目标是找到给定排列的下一个字典序排列(即比当前排列大的下一个排列),如果不存在这样的排列,则返回排序后的最小排列(即字典序最小的排列)。,从数组的最后一个元素开始。原创 2025-07-20 21:00:27 · 681 阅读 · 0 评论 -
098-075 颜色分类
的解法(Dutch National Flag problem)来解决这个问题。这种方法使用三个指针来一次遍历解决s问题,时间复杂度为O(N),空间复杂度为O(1)。这个原地排序透露着一股奸诈味道。原创 2025-07-20 20:59:53 · 350 阅读 · 0 评论 -
097-169 多数元素
最后留下来的一定是target(因为它多,它除了和别人抵消的部分还有剩余)我们可以把所以的其他非target想象成和target对立。target的数量遇到自身增加,遇到其他消去。题目给出了target>n/2。原创 2025-07-20 20:59:22 · 186 阅读 · 0 评论 -
096-136 只出现一次的数字
对于这道题目,我们只要把所有数字进行异或,成对儿的数字就会变成 0,落单的数字和 0 做异或还是它本身,所以最后异或的结果就是只出现一次的元素。一个数和 0 做异或运算的结果为它本身,即。一个数和 0 做异或运算的结果为它本身,即。一个数和它本身做异或运算结果为 0,即。一个数和它本身做异或运算结果为 0,即。原创 2025-07-20 20:58:45 · 90 阅读 · 0 评论 -
095-072 编辑距离
否则,考虑三种操作:删除、插入、替换。,不需要操作,继承上一个状态。获取两个字符串的长度。dp[i][j]代表。原创 2025-07-20 20:58:01 · 398 阅读 · 0 评论 -
094-1143 最长公共子序列 (字符串的多维动态规划还是不简单
数组做初始化操作,为了方便对第一个字符位置做初始化操作,所以下标从。dp[i][j] 代表字符串0-i和0-j的最长公共子序列。开始列出状态转移方程。原创 2025-07-16 08:00:00 · 368 阅读 · 0 评论 -
093-005 最长回文子串
当然这个题我用for暴力肯定是不是最优解的。还是要好好学习一下字符串的多维动态规划。字符串的题我好像一直都做的不太好。更新最长回文子串的起始索引和长度。初始化,所有单个字符都是回文。从第二个字符开始(索引为。且首尾字符相同,则是回文。如果字符串长度小于等于。最长回文子串的起始索引。原创 2025-07-16 10:30:00 · 585 阅读 · 0 评论 -
092-064 最小路径和
独立完成,和上一题思路一毛一样。原创 2025-07-15 14:15:00 · 126 阅读 · 0 评论 -
091-062 不同路径
题目我的思考+word题解题解题解思路classSolutionpublicintintmintn) {int[][]dpnewint[m][n];forinti0;i<m;0]=1;forintj0;j<n;j++) dp[0][j]=1;forinti1;i<m;i++){forintj1;j<n;j++){11returndp[m-1][n-1遇到的问题分析学习到的知识点。原创 2025-07-15 12:45:00 · 134 阅读 · 0 评论 -
090-032 最长有效括号 (明显用栈更好
这个过程通过栈来追踪每个未匹配的 '(' 的位置,并利用这些位置来计算当前找到的有效括号长度。希望这个详细过程能帮助你更好地理解栈方法的实现!这个问题可以通过动态规划或栈来解决。这里介绍使用栈的方法,因为它相对更容易理解。如果栈为空,将当前索引压入栈,栈顶元素始终是子串起始位置的。如果栈不为空,计算当前有效长度并更新最大长度。在每次找到一个有效括号时,更新最大长度。,检查是否可以形成更长的有效括号。当前索引和栈顶元素的索引差值。返回最长有效括号的长度。返回最长有效括号的长度。原创 2025-07-15 12:15:00 · 689 阅读 · 0 评论 -
089-416 分割等和子集 01背包
LeetCode中“分割等和子集”(Partition Equal Subset Sum)的问题要求判断一个非空数组是否可以分割成两个和相等的子集。这实际上是一个经典的。如果总和是奇数,不可能分割成两个和相等的子集。目标是找到一个子集,使得其和等于总和的一半。dp[i] 表示是否存在子集和为 i。的子集是存在的(空集),表示是否存在子集和为。表示是否存在子集和为。原创 2025-07-14 19:30:00 · 551 阅读 · 0 评论 -
088-152 乘积最大子数组⭐⭐⭐
我们需要同时跟踪最大乘积和最小乘积,以确保在遇到负数时能够正确更新最大乘积。更新最大乘积,当前值、当前值乘以上一个最大乘积和当前值乘以上一个最小乘积中的最大值。更新最小乘积,当前值、当前值乘以上一个最大乘积和当前值乘以上一个最小乘积中的最小值。更新最大乘积,当前值或当前值乘以上一个最大乘积或当前值乘以上一个最小乘积中的最大值。更新最小乘积,当前值或当前值乘以上一个最大乘积或当前值乘以上一个最小乘积中的最小值。在数组中存在负数时,最小乘积可以在遇到另一个负数时转换为最大乘积。初始化最大乘积、最小乘积和结果。原创 2025-07-14 19:00:00 · 645 阅读 · 0 评论 -
087-300 最长递增子序列
/好好好,当时就没弄懂是吧 24/12/19更。数组中的最大值,即最长递增子序列的长度。24/12/19看到了+二分查找的优化。数组,每个位置的初始值为。双指针,还是很好理解的。原创 2025-07-12 16:30:00 · 1097 阅读 · 0 评论 -
086-139 单词拆分 3
HashSet 是 Java 集合框架中的一个重要类,用于存储。前 i 个字符是否可以被拆分成字典中的单词。一旦找到一个满足条件的拆分,停止内层循环。如果是遍历字符串会非常非常麻烦!它基于哈希表实现,具有高。本质考察的还有对字符串的处理。初始条件:空字符串可以被拆分。效的插入、删除和查找操作。原创 2025-07-12 10:15:00 · 561 阅读 · 0 评论 -
085-322 零钱兑换
dp数组存储的是每个金额对应需要的最少硬币个数。仍然是正无穷大,说明无法凑成该金额,返回。,每个元素初始化为正无穷大。,说明可以使用这个硬币。原创 2025-07-11 13:00:00 · 295 阅读 · 0 评论 -
084-279 完全平方数
将 dp 数组的每一个元素都设置为 Integer.MAX_VALUE,通常用于动态规划初始化,表示某个状态的初始值为无穷大(即不可达)。Integer.MAX_VALUE 是 java.lang.Integer 类中的一个常量,表示 Java 中 int 类型的最大值。这行代码的主要目的是将数组 dp 中的所有元素都设置为 Integer.MAX_VALUE,也就是 Java 中表示整数最大值的常量。fill 是 Arrays 类中的一个静态方法,用于将指定值填充到数组的每一个元素中。原创 2025-07-11 12:00:00 · 265 阅读 · 0 评论 -
083-198 打家劫舍
/ 进一步对滚动数组的空间优化 dp数组只存与计算相关的两次数据。DP数组中要保存的到当前房子时候所能打劫到的最多的钱。的值为偷当前房子和不偷当前房子两种情况中的较大值。格空间 只记录与当前计算相关的前两个结果。首先要考虑的是DP数组要保存的是什么?我还记得我写过呢,一点印象都没有啊。如果不偷当前房子,则金额为。如果偷当前房子,则金额为。个房子能偷到的最多金额。从第三个房子开始遍历。原创 2025-07-11 07:27:40 · 244 阅读 · 0 评论 -
082-118 杨辉三角
中间元素是前一行两个元素之和。还是蛮简单的,就是基本的方法。学习:加强对容器的熟练使用。从第二行开始构建杨辉三角。将当前行添加到三角形中。其实还好吧,有几个点。每行的最后一个元素是。原创 2025-07-11 07:27:01 · 383 阅读 · 0 评论 -
081-070 爬楼梯
题目我的思考+word题解classSolutionpublicintintn) {if(n<=2returnn;int[]dpnewint[n+1dp[1]=1;dp[2]=2;forinti3;i<=n;i++){1]+dp[i-2returndp[n];原创 2025-07-11 07:26:27 · 274 阅读 · 0 评论 -
080-763 划分字母区间
对于输入 s = "eccbbbbdec",字符串中只能划分为一个片段 "eccbbbbdec",它的长度为 10。这个流程显示了如何根据每个字符的最后出现位置来动态划分字符串,使得每个片段的字母不重复出现在其他片段中。找出字符串的划分方案,使得每个字母只出现在一个片段中,并返回每个片段的长度。我们开始第二次遍历字符串,并根据每个字符的最后出现位置来划分片段。我们首先遍历字符串 s,记录每个字符最后出现的位置。遍历字符串,把每个字母出现的首尾下标放入hash表。当遍历到片段的结束位置时,进行划分。原创 2025-07-10 07:35:31 · 580 阅读 · 0 评论 -
078-055 跳跃游戏 2
如果在某个位置上,你的最远到达距离没有办法继续推进(即你被卡住了),则返回 false。如果在某个位置上,最远能到达的距离已经超过了数组的最后一个位置,则返回 true。我们可以从左到右遍历数组,并在每个位置上计算你能到达的最远位置。如果当前索引超过了最远可达的位置,则不能到达最后一个位置。如果最远可达的位置已经超出了或达到了最后一个位置,返回。,表示不能到达最后一个位置。初始化最远可达的位置为。如果循环结束后没有返回。这道题的关键在于确定你。原创 2025-07-10 07:33:44 · 151 阅读 · 0 评论 -
079-045 跳跃游戏Ⅱ 略微抽象
通过这个用例,你可以清楚地看到算法如何在遍历数组的过程中计算最远能到达的位置,并通过尽可能大的跳跃次数来减少总跳跃次数。核心思想是在遍历数组时,用两个变量 currentEnd 和 farthest 来记录当前跳跃范围的终点和最远能到达的位置。如果当前跳跃范围的终点已经到达或超过了最后一个位置,则直接跳出循环。到达了最远位置的下一跳也是最远距离内所有位置能到达的最远距离。每次跳跃的终点并不是指从当前位置跳跃的最远距离。找出从第一个位置到最后一个位置的最少跳跃次数。更新当前跳跃范围的终点为最远能到达的位置。原创 2025-07-10 07:35:01 · 546 阅读 · 0 评论 -
077-121买卖股票的最佳时机
这个问题可以通过一次遍历解决。在遍历过程中,我们需要记录到目前为止的最低价格,同时计算每一天可能的最大利润。如果当前价格减去记录的最低价格大于当前的最大利润,则更新最大利润。初始化最低价格为最大整数,以便在比较时能轻松更新。如果当前价格比记录的最低价格还低,更新最低价格。如果当前利润大于已记录的最大利润,更新最大利润。计算当前的潜在利润,即如果在今天卖出股票。果然超时了哈哈哈哈哈哈哈。遍历价格数组中的每个价格。返回最终计算出的最大利润。,因为不买卖股票利润为。原创 2025-07-10 07:33:05 · 272 阅读 · 0 评论 -
076-295 数据流中的中位数 3 hard
如果最小堆的元素多于最大堆的元素,将最小堆的堆顶元素移回最大堆。如果最大堆和最小堆的大小相同,中位数是两个堆顶元素的平均值。我是懂了,它这个最大堆和最小堆的元素加到一起是总和。如果最大堆的元素更多,中位数是最大堆的堆顶元素。/** 向数据结构中添加一个数 *//** 返回当前数据流的中位数 */思路稍微复杂一丢丢,但是代码还是极其简单的。确保最大堆中的所有元素都小于最小堆中的元素。/** 初始化数据结构 */首先将新元素添加到最大堆。最大堆,保存较小的一半。最小堆,保存较大的一半。原创 2025-07-10 07:32:25 · 647 阅读 · 0 评论 -
075前K个高频元素 有一些不会用的方法(KV整体)
这句代码的作用是创建一个PriorityQueue,即一个最小堆,其元素类型是Map.Entry<Integer, Integer>,并且按照Map.Entry对象中的值(即频率)进行排序。因此,PriorityQueue<Map.Entry<Integer, Integer>>声明了一个优先队列,其中的每个元素都是一个Map.Entry对象,代表一个键值对。这在寻找前K个高频元素的问题中很有用,因为我们需要不断插入新的元素到堆中,并在必要时移除堆顶的元素来保持堆的大小不超过K。统计每个元素出现的频率。原创 2025-07-10 07:31:46 · 769 阅读 · 0 评论 -
074-215 数组中的第K个最大元素
这种方法在处理大数组时非常高效,因为我们只需维护一个大小为k的堆,而不是对整个数组进行排序。最小堆的堆顶元素就是数组中的第。这样我们就能确保堆中只保留前。创建一个最小堆,初始容量为。,之后是可以动态扩展的。遍历数组中的每个元素。将元素添加到最小堆中。原创 2025-07-10 07:31:10 · 290 阅读 · 0 评论 -
⭐*5 073柱状图中最大的矩阵(以后再看吧)
这个例子通过详细的步骤解释了如何通过单调栈有效地找到每个柱子的左右边界,并计算出最大矩形面积。在这个测试用例中,最大的矩形面积是 10,对应的柱子高度为 5 和 6,宽度为 2。当当前柱子比栈顶柱子矮时,处理栈顶柱子。如果栈为空,说明当前柱子是最矮的。定义一个栈,存放柱子的索引。计算面积并更新最大面积。特殊情况处理:空数组。将当前柱子的索引入栈。原创 2025-07-10 07:30:35 · 253 阅读 · 0 评论 -
072-739 每日温度 单调栈
栈中存储的是温度的索引,栈顶的温度值总是比当前的温度值低。当找到一个更高的温度时,栈中的索引出栈,并计算两个索引的差值,记录在结果中。当栈不为空且当前温度大于栈顶索引对应的温度时,小于当前温度的栈中元素都弹出。创建一个栈,用来存储温度的索引。解决这个问题的最佳方法是使用。创建一个结果数组,初始值为。计算天数差,并存入结果数组。弹出栈顶元素,得到索引。,长度与温度数组相同。原创 2025-07-10 07:29:59 · 183 阅读 · 0 评论 -
071-394 字符串解码 3 不是很难,要理解双端队列这个数据结构
记录此 [ 前的倍数 multi 至栈,用于发现对应 ] 后,获取 multi × [...] 字符串。cur_multi是当前 [ 到 ] 内字符串的重复倍数,例如 "3[a2[c]]" 中的 2。last_res是上个 [ 到当前 [ 的字符串,例如 "3[a2[c]]" 中的 a;空间复杂度 O(N),辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。当 c 为数字时,将数字字符转化为数字 multi,用于后续倍数计算;创建两个栈,一个用于存储数字,一个用于存储字符串。原创 2025-07-10 07:29:29 · 826 阅读 · 0 评论 -
070-155 最小栈
具体来说,对于 Deque 的实现类如 LinkedList 和 ArrayDeque,peek() 可以用来查看栈顶或队列头部的元素而不移除它。在 MinStack 实现中,peek() 方法用于检查栈的当前最小值或栈顶元素。使用两个栈,一个用于存储所有元素,一个用于存储当前最小值。将当前元素与最小值栈顶元素比较,将较小值压入最小值栈。返回最小值栈顶元素,即当前栈中的最小值。将元素压入存储所有元素的栈。移除存储所有元素的栈顶元素。返回存储所有元素的栈顶元素。同时移除最小值栈顶元素。用于存储所有元素的栈。原创 2025-07-10 07:28:58 · 755 阅读 · 0 评论 -
069-20 有效的括号
如果栈为空,说明所有括号都匹配,否则返回。如果字符串长度为奇数,不可能是有效的。检查当前右括号是否与栈顶的左括号匹配。如果栈为空,说明没有匹配的左括号。如果是左括号,压入栈中。原创 2025-07-10 07:28:28 · 250 阅读 · 0 评论 -
068-004 寻找两个正序数组中的中位数 hard不易理解(难死了)
划分点 i 和 j 共同作用,需要满足一定的大小关系,即 nums1[i - 1] <= nums2[j] 且 nums2[j - 1] <= nums1[i]。这意味着左半部分的所有元素都小于等于右半部分的所有元素。,它和在数组 nums1 上的划分点 i 共同作用,以实现将两个数组合并后的整体进行合理划分,使得划分后的左右两部分满足特定的数量和大小关系。如果总长度是偶数,中位数是左边部分的最大值和右边部分的最小值的平均值。为偶数,中位数就是左半部分的最大值和右半部分的最小值的平均值,即。原创 2025-07-10 07:27:57 · 730 阅读 · 0 评论 -
067-153 寻找旋转排序数组中的最小值
不对,突然感觉好像更简单一些。确实,这是上一题的一小步而已。还是要找到排序的分开的位置。这个题和066是很像的。原创 2025-07-10 07:27:25 · 89 阅读 · 0 评论 -
066-033 搜索旋转排序数组
findMin 函数用于在一个旋转排序数组中找到最小元素的索引。旋转排序数组是指一个有序数组在某个点进行了旋转,比如 [4, 5, 6, 7, 0, 1, 2]。该函数利用二分查找法,通过比较中间元素和数组末尾元素的大小来缩小搜索范围,从而找到最小值。旋转排序数组的特点是数组本来是有序的,但是经过了一定的旋转,这题好不迷惑,你要是说找target的旋转前的下标我还认为还行,但是这个直接一个二分查找,旋转的意义是啥嘞。// 目标值在左半部分。使得数组的一部分处于原数组的后半部分,而另一部分则处于前半部分。原创 2025-07-10 07:25:24 · 638 阅读 · 0 评论 -
065-034 在排序数组中查找元素的第一个和最后一个位置
我的狮山代码,但终究是有自己的想法的,自己的孩子,注入心血,再差也要培养!我的思路是先找到一个target,然后再向左右去找左右的边界位置。这题目有点没看懂啊,啊,我懂了嗯,但是这个用二分嘛。先用二分找到,目标值,再从目标值向两边扩散。而gpt还是用了两次二分查找。我觉得还是我的更好一点。原创 2025-07-09 07:58:33 · 282 阅读 · 0 评论 -
064-074 搜索二维矩阵
在 while 循环中,计算中间位置 mid,并将其映射到二维矩阵中的位置 matrix[mid / cols][mid % cols]。2.先从中间找,if(小于首数){i-1}else if(大于尾数){i+1}else{return false}进行二分查找,时间复杂度为 O(log(m * n)),空间复杂度为 O(1),是一种高效的解决方案。因为是二分查找的题目,所以我们按照二分的思想来考虑。1.读取二维数组的行和列 int m,n。这一行没找到并且数值在这一行间。修正,每一次换行要重置。原创 2025-07-09 07:57:59 · 518 阅读 · 0 评论 -
063-035 搜索插入位置
题目我的思考classSolutionprivateintlowerBoundint[]numsinttarget){intleft0,right =numslength1;whileintmid2;if1;else1;returnleft;publicintint[]numsinttarget) {returnlowerBound题解题解思路遇到的问题分析学习到的知识点。原创 2025-07-09 07:57:29 · 189 阅读 · 0 评论 -
062-051 N皇后 其实不难(回溯要常复习,要熟练)
1.从第一行开始,选择一个位置Q皇后入位,把它的横竖斜都标记为不可用 . ,里面的哦,因为只有当前皇后放置可以了才会进行下一行和回溯哦。度对角线(左上到当前位置,因为下面还没放置皇后)将字符数组转换为字符串加入列表。如果当前位置可以放置皇后,返回。尝试在当前行的每一列放置皇后。检查当前位置是否可以放置皇后。2.逐行尝试,直到最后一行。个皇后,保存当前棋盘的状态。度对角线(右上到当前位置)终止是已经放置了皇后的。将棋盘数组转换为列表。原创 2025-07-09 07:56:56 · 1183 阅读 · 0 评论