n = len(nums)
stack = []
res = [-1] * n
for i in range(2*n - 1):
num = nums[i % n]
while stack and num > nums[stack[-1]]:
res[stack[-1]] = num
stack.pop()
if i < n: stack.append(i)
return res
LeetCode.42 接雨水
暴力解法 (超时)
res = 0
for i in range(1, len(height)-1):
left, right = i, i
maxleft, maxright = height[left], height[right]
while left >= 0 and right <= len(height)-1:
if height[left] > height[right]:
if right == len(height) - 1: break
right += 1
maxright = max(maxright, height[right])
else:
if left == 0: break
left -= 1
maxleft = max(maxleft, height[left])
water = min(maxleft, maxright) - height[i]
res += water
return res
双指针解法
left, right = [height[0]] * len(height), [height[-1]] * len(height)
for i in range(1, len(left)):
left[i] = max(left[i-1], height[i])
for i in range(len(right)-2, -1, -1):
right[i] = max(right[i+1], height[i])
return sum(min(left[i], right[i]) - height[i] for i in range(1, len(left) - 1))
单调栈解法
stack = [0]
res = 0
for i in range(1, len(height)):
while stack and height[i] >= height[stack[-1]]:
mid_height = height[stack.pop()]
if stack:
res += (min(height[stack[-1]], height[i]) - mid_height) * (i - stack[-1]- 1)
stack.append(i)
return res