LeetCode 74:搜索二维矩阵

给你一个 m x n 的整数矩阵 matrix 和一个整数 target。如果 target 在矩阵中,返回 True;否则返回 False。 题目给出的矩阵满足两个条件: 每一行都按非递减顺序排列。 每一行的第一个整数都严格大于上一行的最后一个整数。 要求算法的时间复杂度为 O(log(m * n))。 例如,对于下面的矩阵: 1 3 5 7 10 11 16 20 23 30 34 60 target = 3 时返回 True。 target = 13 时返回 False。 约束如下: 1 <= m, n <= 100 -10^4 <= matrix[i][j], target <= 10^4 LeetCode 提供的方法签名是: class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: pass 第一步:扫描每一个元素 现在只有题目条件和方法签名,还没有一段能判断目标值是否存在的代码。先解决最基本的问题:怎样得到一个可以直接运行、结果确定正确的版本? 当前基线无法对示例中的 3 或 13 给出答案。加入一层遍历每一行的循环,再在当前行中检查每一个值。遇到目标值就立即返回 True;只有检查完所有元素仍未命中时,才返回 False。 ...

2026年8月13日 · 6 分钟 · map[name:Jeanphilo]

LeetCode 153:寻找旋转排序数组中的最小值

题目要求 输入给出一个非空整数数组 nums。数组中的元素互不相同;旋转前,数组按严格递增顺序排列。 数组会被旋转 1 到 nums.length 次。每旋转一次,就把最后一个元素移到数组最前面;因此,旋转 nums.length 次后,数组恢复为原来的递增顺序。返回旋转后数组中的最小值。题目要求算法的运行时间为 O(log n)。 LeetCode 使用以下方法契约: class Solution: def findMin(self, nums: List[int]) -> int: 官方示例 输入:nums = [3,4,5,1,2] 输出:1 输入:nums = [4,5,6,7,0,1,2] 输出:0 输入:nums = [11,13,15,17] 输出:11 约束 1 <= nums.length <= 5000 -5000 <= nums[i] <= 5000 nums 中的所有整数互不相同。 旋转前,nums 按严格递增顺序排列。 nums 被旋转 1 到 nums.length 次。 Step 1:先得到一个肯定正确的最小值 对于 [3,4,5,1,2],为什么不能直接返回第一个元素? 压力 这个数组的第一个元素是 3,但最小值是旋转后移到中间的 1。旋转保留了所有值,却不保证最小值仍在下标 0,所以直接返回 nums[0] 会得到错误答案。 ...

2026年7月28日 · 5 分钟 · map[name:Jeanphilo]

LeetCode 33:搜索旋转排序数组

题目要求 输入给出一个整数数组 nums 和一个整数 target。nums 中的元素互不相同;旋转前,数组严格递增。调用方法前,数组可能在某个未知下标 k(0 <= k < nums.length)处旋转为: [nums[k], ..., nums[n-1], nums[0], ..., nums[k-1]] 如果 target 存在,返回它在旋转后数组中的下标;否则返回 -1。题目要求算法的运行时间为 O(log n)。 LeetCode 使用以下方法契约: class Solution: def search(self, nums: List[int], target: int) -> int: 官方示例 输入:nums = [4,5,6,7,0,1,2], target = 0 输出:4 输入:nums = [4,5,6,7,0,1,2], target = 3 输出:-1 输入:nums = [1], target = 0 输出:-1 约束 1 <= nums.length <= 5000 -10^4 <= nums[i], target <= 10^4 nums 中的每个值都互不相同。 nums 旋转前按严格递增顺序排列。 Step 1:先正确搜索每一种旋转 对于 [4,5,6,7,0,1,2],怎样先得到一个不受旋转位置影响的正确答案? ...

2026年7月28日 · 6 分钟 · map[name:Jeanphilo]

LeetCode 503:下一个更大元素 II,循环数组中的右侧到哪里结束

题目要求 给定一个循环整数数组 nums,返回数组 answer。 对每个下标 i: answer[i] = 从 i 向右遇到的第一个严格大于 nums[i] 的元素值 如果绕行一圈后仍然没有更大元素,answer[i] = -1。 “循环数组”表示走过最后一个位置后,可以继续从下标 0 开始;但一个下标不能绕一圈后把自己当成答案。 LeetCode 提供的方法接口是: nextGreaterElements(nums: List[int]) -> List[int] 示例 1 输入:nums = [1,2,1] 输出:[2,-1,2] 第一个 1 向右首先遇到更大的 2。 2 绕行一圈也找不到严格更大的元素,答案是 -1。 最后一个 1 走到数组末尾后绕回开头,随后遇到 2。 示例 2 输入:nums = [2,2,2] 输出:[-1,-1,-1] 相等元素不属于“更大元素”。 示例 3 输入:nums = [7] 输出:[-1] 数组只有一个元素时,它不能把自己作为下一个更大元素。 约束 1 <= nums.length <= 10^4 -10^9 <= nums[i] <= 10^9 Step 1:循环数组中的“右边”到哪里结束 先看: ...

2026年7月20日 · 4 分钟 · map[name:Jeanphilo]

LeetCode 84:柱状图中最大的矩形,连续区间的高度由谁决定

题目要求 给定一个非负整数数组 heights。每个 heights[i] 表示宽度为 1 的柱子高度,所有柱子紧挨排列。 题目要求返回柱状图中能够形成的最大矩形面积。 一个合法矩形必须覆盖一段连续柱子。它的宽度是这段区间包含的柱子数量,高度不能超过区间中的最矮柱。 LeetCode 提供的方法接口是: largestRectangleArea(heights: List[int]) -> int 示例 1 输入:heights = [2,1,5,6,2,3] 输出:10 下标 2 和 3 的两根柱子高度分别是 5 和 6,可以形成高度 5、宽度 2、面积 10 的矩形。 示例 2 输入:heights = [2,4] 输出:4 可以选择高度 4、宽度 1,也可以选择高度 2、宽度 2,最大面积都是 4。 约束 1 <= heights.length <= 10^5 0 <= heights[i] <= 10^4 Step 1:矩形面积不是柱高之和 先看一个小柱状图: heights = [2,1,2] 如果矩形覆盖全部三根柱子,它的宽度是 3,但高度最多只能是 1: height = 1 width = 3 area = 1 * 3 = 3 不能把三根柱高相加得到 5。柱状图矩形覆盖的是一块完整矩形区域,中间高度为 1 的柱子会限制整个区间的矩形高度。 ...

2026年7月20日 · 5 分钟 · map[name:Jeanphilo]

LeetCode 136:只出现一次的数字,如何在常量空间排除重复元素

题目要求 给你一个非空整数数组 nums。 数组中只有一个元素出现一次,其余每个元素都恰好出现两次。题目要求返回那个只出现一次的元素。 LeetCode 提供的方法接口是: singleNumber(nums: List[int]) -> int 除了返回正确答案,解法还需要满足两个要求: 时间复杂度是 O(n)。 只使用 O(1) 额外空间。 示例 1 输入:nums = [2,2,1] 输出:1 2 出现两次,只有 1 出现一次。 示例 2 输入:nums = [4,1,2,1,2] 输出:4 1 和 2 都能找到相同的另一个元素,最后只有 4 没有配对。 示例 3 输入:nums = [1] 输出:1 数组只有一个元素时,它就是答案。 约束 1 <= nums.length <= 3 * 10^4 -3 * 10^4 <= nums[i] <= 3 * 10^4 除一个元素只出现一次外,其余元素都恰好出现两次。 Step 1:先把“只出现一次”说准确 先看: nums = [4,1,2,1,2] 在这个很小的数组里,我们可以用眼睛寻找相同的数字: ...

2026年7月15日 · 3 分钟 · map[name:Jeanphilo]

LeetCode 191:位 1 的个数,如何跳过无关的零位

题目要求 给定一个正整数 n,返回它的二进制表示中 1 的个数。这个数量也叫 Hamming weight。 LeetCode 提供的方法接口是: hammingWeight(n: int) -> int 示例 1 输入:n = 11 二进制:1011 输出:3 示例 2 输入:n = 128 二进制:10000000 输出:1 约束 1 <= n <= 2^31 - 1 输入处于题目给定的非负整数范围内。 虽然当前约束从 1 开始,后面的实现也会自然处理 n = 0,并返回 0。 Step 1:先明确到底在数什么 先看一个不使用十进制表示的小任务: n = 101100₂ 从左到右可以看到三个 1: 1 0 1 1 0 0 ^ ^ ^ 所以答案是 3。 当前 baseline 是: 先看出整数的二进制表示,再人工统计其中的 1。 这个 baseline 的 break 是: ...

2026年7月15日 · 3 分钟 · map[name:Jeanphilo]

LeetCode 338:比特位计数,如何复用较小数字的结果

题目要求 给定一个非负整数 n,返回一个长度为 n + 1 的数组 answer。 其中: answer[i] = 整数 i 的二进制表示中 1 的数量 需要回答的范围包含 0 和 n。 LeetCode 提供的方法接口是: countBits(n: int) -> List[int] 示例 1 输入:n = 2 输出:[0,1,1] 对应关系是: 0 -> 0 -> 0 个 1 1 -> 1 -> 1 个 1 2 -> 10 -> 1 个 1 示例 2 输入:n = 5 输出:[0,1,1,2,1,2] 约束 0 <= n <= 10^5 Step 1:这次要回答 0 到 n 的所有数字 LeetCode 191 只要求统计一个整数。现在看 n = 5: ...

2026年7月15日 · 3 分钟 · map[name:Jeanphilo]

LeetCode 739:每日温度,如何找到右侧第一个更高温度

题目要求 给定一个整数数组 temperatures,其中 temperatures[i] 表示第 i 天的温度。 返回数组 answer,其中: answer[i] = 从第 i 天开始,需要等待多少天才会遇到更高温度 如果之后没有更高温度,answer[i] = 0。 这里的“更高”是严格大于。相同温度不能结算等待中的日期。 LeetCode 提供的方法接口是: dailyTemperatures(temperatures: List[int]) -> List[int] 示例 输入:temperatures = [73,74,75,71,69,72,76,73] 输出:[1,1,4,2,1,1,0,0] 约束 1 <= temperatures.length <= 10^5 30 <= temperatures[i] <= 100 Step 1:答案不是更高温度,而是等待天数 先看一个更小的输入: temperatures = [73,71,72,76] 逐天回答: 第 0 天是 73,右侧第一个更高温度是第 3 天的 76,等待 3 天。 第 1 天是 71,第 2 天的 72 更高,等待 1 天。 第 2 天是 72,第 3 天的 76 更高,等待 1 天。 第 3 天右侧没有日期,答案是 0。 所以结果是: ...

2026年7月15日 · 3 分钟 · map[name:Jeanphilo]

LeetCode 45:跳跃游戏 II,从可达边界升级到最少跳数

题目要求 给你一个整数数组 nums。 你一开始站在下标 0。 nums[i] 表示: 从下标 i 最多可以向右跳多少步 题目要求返回: 到达最后一个下标所需的最少跳跃次数 输入输出 输入:nums: List[int] 输出:int 从下标 0 出发 每个数字表示最大跳跃长度,不是必须跳这么远 题目保证一定可以到达最后一个下标 只需要返回最少跳数,不需要返回具体路径 示例 输入:nums = [2,3,1,1,4] 输出:2 一种最少跳法是: 0 -> 1 -> 4 从下标 0 跳到下标 1,再从下标 1 跳到最后一个下标。 输入:nums = [2,3,0,1,4] 输出:2 虽然中间有 0,但仍然可以: 0 -> 1 -> 4 约束 1 <= nums.length <= 10^4 0 <= nums[i] <= 1000 题目保证 nums[n - 1] 可达 Step 1:45 不是问能不能到,而是问最少几步到 如果刚做完 LeetCode 55,已经知道可以维护: ...

2026年7月8日 · 4 分钟 · map[name:Jeanphilo]