for i in range(0, len(temperatures)): while len(stack) > 0: if temperatures[stack[-1]] < temperatures[i]: res[stack[-1]] = i - stack[-1] stack.pop() else: break stack.append(i) return res
class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: res = [-1] * len(nums2) stack = [] for i in range(len(nums2)): while len(stack) > 0: if nums2[stack[-1]] < nums2[i]: res[stack[-1]] = nums2[i] stack.pop() else: break stack.append(i) new_res = [] # 也可以使用哈希表来存储 for i in nums1: cur = res[nums2.index(i)] new_res.append(cur) return new_res
class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: stack = [] n = len(nums) res = [-1] * n for i in range(n * 2): while len(stack) > 0: cur = stack[-1] if nums[cur % n] < nums[i % n]: res[cur % n] = nums[i % n] stack.pop() else: break stack.append(i) return res
class Solution: def trap(self, height: List[int]) -> int: stack = [] water = 0
for i in range(len(height)): while stack: if height[stack[-1]] < height[i]: last = stack.pop() # 注意底部出栈后,可能没有左墙,则需要跳出当前循环 if not stack: break w = i - stack[-1] - 1 # last 是底部,i 是右墙,stack[-1] 是左墙 h = min(height[stack[-1]], height[i]) - height[last]
water += h * w else: break stack.append(i) return water
for i in range(len(heights)): while stack: if heights[stack[-1]] > heights[i]: last = stack.pop() w = i - stack[-1] - 1 h = heights[last] cur = h * w size = max(cur, size) else: break stack.append(i)
class Solution: def largestRectangleArea(self, heights: List[int]) -> int: n = len(heights) left = [-1] * n # 左边第一个比它小的位置 right = [n] * n # 右边第一个比它小的位置 stack = []
# 计算 left[] for i in range(n): while stack and heights[stack[-1]] >= heights[i]: stack.pop() left[i] = stack[-1] if stack else -1 stack.append(i)
stack.clear()
# 计算 right[] for i in reversed(range(n)): while stack and heights[stack[-1]] >= heights[i]: stack.pop() right[i] = stack[-1] if stack else n stack.append(i)
# 枚举每个柱子作为矩形的“最矮边” max_area = 0 for i in range(n): width = right[i] - left[i] - 1 area = heights[i] * width max_area = max(max_area, area)