503. Next Greater Element II
方法和739. 一样,区别在于一个循环数组
一种方法是将两个数组拼接,另一种是模拟走两遍数组
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
res = [-1] * len(nums)
stack = [0]
# 模拟走了两遍nums
for i in range(1, len(nums) * 2):
if nums[i % len(nums)] < nums[stack[-1]]:
stack.append(i % len(nums))
elif nums[i % len(nums)] == nums[stack[-1]]:
stack.append(i % len(nums))
else:
while stack and nums[i % len(nums)] > nums[stack[-1]]:
res[stack[-1]] = nums[i % len(nums)]
stack.pop()
stack.append(i % len(nums))
return res
42. Trapping Rain Water
双指针
计算每一列的雨水的高度,每一列雨水的高度,取决于,该列左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度
!会超时
class Solution:
def trap(self, height: List[int]) -> int:
res = 0
for i in range(len(height)):
if i == 0 or i == len(height) - 1:
continue
l_height = height[i - 1] # 记录i列左边最高高度
r_height = height[i + 1] # 记录i列右边最高高度
for j in range(i - 1):
if height[j] > l_height:
l_height = height[j]
for k in range(i + 2, len(height)):
if height[k] > r_height:
r_height = height[k]
c_water = min(l_height, r_height) - height[i]
if c_water > 0:
res += c_water
return res
单调栈
一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。
class Solution:
def trap(self, height: List[int]) -> int:
stack = [0]
res = 0
for i in range(1, len(height)):
if height[i] < height[stack[-1]]:
stack.append(i)
elif height[i] == height[stack[-1]]:
stack.pop() # 遇到相同高度的柱子,只需要最右边的柱子来计算宽度
stack.append(i)
else:
while stack and height[i] > height[stack[-1]]:
mid = stack.pop()
if stack:
h = min(height[stack[-1]], height[i]) - height[mid]
w = i - stack[-1] - 1
res += h * w
stack.append(i)
return res