451 字
2 分钟
代码随想录算法训练营第四十一天 | 单调栈 Part01

单调栈#

  • 单调栈是一种特殊的栈结构,通常用于解决“下一个最值”问题。
  • 通过维护栈内元素的单调性,可以高效地找到满足条件的元素。
  • 常见应用场景包括:查找下一个更大/小的元素、计算区间最大值等。
  • 核心思想是:当新元素到来时,比较它与栈顶元素的大小关系,决定是否出栈或入栈。
  • 时间复杂度通常为 O(n)O(n),因为每个元素最多入栈和出栈一次。
  • 空间复杂度为 O(n)O(n),用于存储栈元素。

单调栈模板#

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/
作者
Jarrett
发布于
2025-07-28
许可协议
CC BY-NC-SA 4.0