LeetCode 394:字符串解码,如何保存并恢复嵌套上下文

题目要求 给定一个编码字符串 s,返回它解码后的字符串。 编码规则是: k[encoded_string] 方括号中的 encoded_string 需要连续重复 k 次,其中 k 是正整数。编码可以嵌套,也可以与普通小写字母相邻。 题目保证: 输入字符串始终有效,方括号完整配对且没有多余空格。 原始文本不包含数字,数字只表示重复次数。 不会出现 3a 或 2[4] 这类不符合编码规则的输入。 解码后的字符串长度不会超过 10^5。 示例 输入 输出 "3[a]2[bc]" "aaabcbc" "3[a2[c]]" "accaccacc" "2[abc]3[cd]ef" "abcabccdcdcdef" 约束 1 <= s.length <= 30 s 只包含小写英文字母、数字和 [] 所有重复次数都在 [1, 300] 范围内 LeetCode 提供的方法签名是: class Solution: def decodeString(self, s: str) -> str: pass Step 1:进入内层以后,外层信息去了哪里 先从没有嵌套的输入开始: 3[a] 读到 3 后知道下一段需要重复三次;读完方括号中的 a,得到: a * 3 = aaa 当前 baseline 是: 读出一个重复次数,再收集后续方括号中的文本,遇到 ] 时执行重复。 这个 baseline 可以处理一层 3[a],却会在 3[a2[c]] 上中断。外层已经读到重复次数 3 和普通字母 a,此时又遇到了内层编码 2[c]。如果直接把当前次数改成 2、当前文本改成 c,外层的 3 和 a 就丢失了。 ...

2026年8月21日 · 4 分钟 · 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 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 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]

LeetCode 435:无重叠区间,从删除最少转成保留最多

题目要求 给你一个区间数组 intervals。 每个区间写成: [start, end] 题目要求删除尽量少的区间,使剩下的区间互不重叠。 最后返回: 最少需要删除多少个区间 输入输出 输入:intervals: List[List[int]] 输出:int 每个区间满足 start < end 如果两个区间只是在端点相接,不算重叠 也就是说: [1,2] 和 [2,3] 可以同时保留。 示例 输入:intervals = [[1,2],[2,3],[3,4],[1,3]] 输出:1 删除 [1,3] 后,剩下: [[1,2],[2,3],[3,4]] 这些区间互不重叠。 再看两个边界例子: 输入:intervals = [[1,2],[1,2],[1,2]] 输出:2 三个完全相同的区间最多只能保留一个,所以要删除两个。 输入:intervals = [[1,2],[2,3]] 输出:0 这两个区间只在端点 2 相接,不算重叠,所以不用删除。 约束 1 <= intervals.length <= 10^5 intervals[i].length == 2 -5 * 10^4 <= start_i < end_i <= 5 * 10^4 Step 1:不要先问删哪个,先问最多能留几个 先看这个例子: intervals = [[1,2],[2,3],[3,4],[1,3]] 题目问的是: ...

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

LeetCode 452:用最少数量的箭引爆气球,从共同交集推出区间贪心

题目要求 给你一个气球数组 points。 每个气球是一个水平区间: [start, end] 如果一支箭射在横坐标 x 上,并且: start <= x <= end 那么这支箭可以射爆这个气球。 一支箭会一直向上飞,所以同一个 x 上能覆盖到的所有气球都会被射爆。 题目要求返回: 射爆所有气球需要的最少箭数 输入输出 输入:points: List[List[int]] 输出:int 每个气球是一个区间 [start, end] 箭的位置 x 可以落在端点上 不需要返回每支箭的位置,只需要返回最少箭数 示例 输入:points = [[10,16],[2,8],[1,6],[7,12]] 输出:2 一种射法是: x = 6 射爆 [2,8] 和 [1,6] x = 11 射爆 [10,16] 和 [7,12] 再看两个边界例子: 输入:points = [[1,2],[3,4],[5,6],[7,8]] 输出:4 这些气球互不相交,每个气球都需要一支箭。 输入:points = [[1,2],[2,3],[3,4],[4,5]] 输出:2 因为箭可以射在端点上,所以: x = 2 可以射爆 [1,2] 和 [2,3] x = 4 可以射爆 [3,4] 和 [4,5] 约束 1 <= points.length <= 10^5 points[i].length == 2 -2^31 <= start < end <= 2^31 - 1 Step 1:一支箭到底能覆盖哪些气球? 先看一个很小的问题: ...

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