力扣 42. 接雨水 python AC

双指针

class Solution:
    def trap(self, heights):
        l, r = 0, len(heights) - 1
        maxl, maxr = 0, 0
        ans = 0
        while l < r:
            maxl, maxr = max(maxl, heights[l]), max(maxr, heights[r])
            if maxl < maxr:
                ans += maxl - heights[l]
                l += 1
            else:
                ans += maxr - heights[r]
                r -= 1
        return ans

单调栈

class Solution:
    def trap(self, heights):
        ll = []
        ans = 0
        for ind, val in enumerate(heights):
            while ll and val >= heights[ll[-1]]:
                bottom = heights[ll.pop()]
                if ll:
                    h = min(heights[ll[-1]], val) - bottom
                    ans += h * (ind - ll[-1] - 1)
            ll.append(ind)
        return ans

(单调栈做法:)

--创建空列表作为栈(每轮将当前元素索引加入栈)

--遍历

  --(while)如果栈不为空且当前元素值大于等于栈中最后一位索引的值

    --弹出栈中最后一位索引并将该索引代表的值设为底的高度

    --如果栈不为空(如果为空说明左边接不了水,直接退出)

      --求出高h为(上一步弹出后)栈内最后一位索引的值和当前加入栈的值的最小值-底的高度

      --将高h*(当前加入值的索引-栈内最后一位索引-1,即两根柱子的距离)计入总和

  --(此时每轮结束)将此新元素索引加入栈

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值