503. 下一个更大元素 II
1. first idea
将数组过两遍,外层循环中的index,遍历范围翻倍后一律取模就可以了。
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
# stack中存储index
stack = [0]
# res_list 存储nums中每个元素对应的下一个更大的第一个数。
res_list = [-1] * len(nums)
for i in range(1, 2 * len(res_list)):
while (len(stack) > 0) and (nums[i % len(res_list)] > nums[stack[-1]]):
if res_list[stack[-1]] == -1:
res_list[stack[-1]] = nums[i % len(res_list)]
stack.pop()
stack.append(i % len(res_list))
return res_list
42. 接雨水
1. doc reading
当前元素如果大于栈顶。 栈顶元素为底,当前元素为右墙,栈顶的前一个为左墙。 如果栈中元素不够两个,就不构成凹槽,没有新的水,所以跳过。
class Solution:
def trap(self, height: List[int]) -> int:
stack = []
start_idx = 0
for i in range(len(height)):
if height[i] != 0:
stack = [i]
start_idx = i + 1
break
water_volumn = 0
for i in range(start_idx, len(height)):
while (len(stack) > 0) and (height[i] >= height[stack[-1]]):
if height[i] > height[stack[-1]]:
# print(stack)
# i是右边墙
bottom_height = height[stack[-1]]
stack.pop()
if len(stack) > 0:
left_height = height[stack[-1]]
wide = i - stack[-1] - 1
# stack.pop()
water_volumn += (min(left_height, height[i]) - bottom_height) * wide
else:
stack.pop()
stack.append(i)
return water_volumn