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

文章讲述了如何使用单调栈解决两个编程问题:1.查找环形数组中每个元素下一个更大的元素;2.计算柱子形成的水槽能容纳多少雨水。在第一个问题中,通过遍历两倍长度的数组并处理环形条件找到答案。在第二个问题中,单调栈用来跟踪可能形成水槽的柱子,根据柱子高度变化更新结果。
摘要由CSDN通过智能技术生成
  • 今日学习的文章链接,或者视频链接

第十章 单调栈part02

  • 自己看到题目的第一想法

  • 看完代码随想录之后的想法

503:

注意对环形数组的处理:

class Solution:
    def nextGreaterElements(self, nums: List[int]) -> List[int]:
        result = [-1] * len(nums)
        stack = []
        for i in range(len(nums)*2):
            new_i = i%len(nums)
            while(len(stack) != 0 and nums[new_i] > nums[stack[-1]]):
                    result[stack[-1]] = nums[new_i]
                    stack.pop()
            stack.append(new_i)
        return result

42:

 

class Solution:
    def trap(self, height: List[int]) -> int:
        # stack储存index,用于计算对应的柱子高度
        stack = [0]
        result = 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_height = height[stack[-1]]
                    stack.pop()
                    if stack:
                        right_height = height[i]
                        left_height = height[stack[-1]]
                        # 两侧的较矮一方的高度 - 凹槽底部高度
                        h = min(right_height, left_height) - mid_height
                        # 凹槽右侧下标 - 凹槽左侧下标 - 1: 只求中间宽度
                        w = i - stack[-1] - 1
                        # 体积:高乘宽
                        result += h * w
                stack.append(i)
        return result
  • 自己实现过程中遇到哪些困难

  • 今日收获,记录一下自己的学习时长

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值