【力扣日记】042 接雨水 | 双指针 | 正难则反

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

【力扣日记】042 接雨水 | 双指针 | 正难则反_第1张图片
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

算法思路

看标签:栈、数组、双指针。

想着通过较短双指针*间距来求解,但是就例题来说就存在诸多难点,无奈放弃,思索着突然想到:假如把雨水的部分涂黑,那么,整个图形的面积-原数组面积=雨水面积

有了这个等式,那么算法就很好构造了。

class Solution:
    def trap(self, height) -> int:
        res=0
        # 首先,想要接水数组起码不得小于3
        if len(height)<3:return 0

开始双指针

        MIN=0  # 记录当前已经填充的最小高度
        while l<=r:

第一步:l,r=0,11
在这里插入图片描述
通过较短双指针*间距求第一层面积,然后更新MIN,然后就是更新左指针或右指针或左右指针。

                res+=(min(height[l],height[r])-MIN)*(r-l+1)
                if height[l]>height[r]:
                    MIN=height[r]
                    r-=1
                elif height[l]<height[r]:
                    MIN=height[l]
                    l+=1
                else:
                    MIN=height[l]
                    l+=1
                    r-=1

当到达l,r=2,10时,l的高度小于MIN
【力扣日记】042 接雨水 | 双指针 | 正难则反_第2张图片

            if height[l]<MIN:
                l+=1
            elif height[r]<MIN:
                r-=1

完整算法

class Solution:
    def trap(self, height) -> int:
        res=0
        if len(height)<3:return 0
        l,r=0,len(height)-1
        MIN=0
        while l<=r:
            if height[l]<MIN:
                l+=1
            elif height[r]<MIN:
                r-=1
            else:
                res+=(min(height[l],height[r])-MIN)*(r-l+1)
                if height[l]>height[r]:
                    MIN=height[r]
                    r-=1
                elif height[l]<height[r]:
                    MIN=height[l]
                    l+=1
                else:
                    MIN=height[l]
                    l+=1
                    r-=1
        return res-sum(height)

执行用时 :32 ms, 在所有 Python3 提交中击败了99.38%的用户
内存消耗 :14 MB, 在所有 Python3 提交中击败了5.04%的用户

能得到这样的执行时间,真的很惊喜欸。

你可能感兴趣的:(力扣日记)