451 字
2 分钟
代码随想录算法训练营第四十一天 | 单调栈 Part01
单调栈
- 单调栈是一种特殊的栈结构,通常用于解决“下一个最值”问题。
- 通过维护栈内元素的单调性,可以高效地找到满足条件的元素。
- 常见应用场景包括:查找下一个更大/小的元素、计算区间最大值等。
- 核心思想是:当新元素到来时,比较它与栈顶元素的大小关系,决定是否出栈或入栈。
- 时间复杂度通常为 ,因为每个元素最多入栈和出栈一次。
- 空间复杂度为 ,用于存储栈元素。
单调栈模板
def calculateGreaterElement(nums): n = len(nums) res = [0] * n # 存放答案的数组 s = [] # 单调栈 for i in range(n - 1, -1, -1): # 倒序遍历 while s and s[-1] <= nums[i]: s.pop() # 矮个起开,反正也被挡着了 res[i] = -1 if not s else s[-1] # 当前元素的下一个更大元素 s.append(nums[i]) return res
LeetCode 739. 每日温度
class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: n = len(temperatures) res = [0] * n stack = [] for i in range(n - 1, -1, -1): while stack and temperatures[stack[-1]] <= temperatures[i]: stack.pop() res[i] = 0 if not stack else stack[-1] - i stack.append(i) return res
LeetCode 496. 下一个更大元素 I
class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: greater = self.nextGreater(nums2) greater_map = {nums2[i]: greater[i] for i in range(len(nums2))} return [greater_map[num] for num in nums1]
def nextGreater(self, nums): n = len(nums) res = [-1] * n s = [] for i in range(n - 1, -1, -1): while s and s[-1] <= nums[i]: s.pop() res[i] = s[-1] if s else -1 s.append(nums[i]) return res
LeetCode 503. 下一个更大元素 II
class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: n = len(nums) res = [-1] * n s = [] for i in range(2 * n - 1, -1, -1): # 模拟数组的环形结构 while s and s[-1] <= nums[i % n]: s.pop() res[i % n] = s[-1] if s else -1 s.append(nums[i % n]) return res
代码随想录算法训练营第四十一天 | 单调栈 Part01
https://fuwari.vercel.app/posts/code_musings_day_forty-one/