代码随想录第59天|503.下一个更大元素II、42. 接雨水

81 阅读1分钟

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