题解 | #接雨水问题#

接雨水问题

https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f

class Solution:
    def maxWater(self , arr: List[int]) -> int:
        # write code here
        n = len(arr)
        res = 0
        if n == 0 or n == 1: return res
        left = 0
        right = n-1
        l_max = arr[left]
        r_max = arr[right]

        res = 0
        while left < right:
            if l_max < r_max:
                left += 1
                if arr[left] <= l_max:
                    res += l_max - arr[left]
                else:
                    l_max = arr[left]
            elif l_max >= r_max:
                right -= 1
                if arr[right] <= r_max:
                    res += r_max - arr[right]
                else:
                    r_max = arr[right]
        return res

思路:假设对于位置i而言,其左侧数组[0,i-1]的最大值l_max和其右侧数组[i+1,n-1]最大值r_max。接水量dp[i]=min(l_max, r_max) - arr[i]。这里需要考虑如果dp[i]<0,dp[i] = 0。

这里就需要考虑如何更新这个l_max和r_max。既然我们需要的是l_max和r_max中比较小的一个,那设置两个指针,一开始指向0和n-1的位置,哪一个比较小就移动哪一个指针,并在移动过程中,判断当前位置和l_max或r_max的大小,从而不断计算接水量,和更新l_max和r_max的值。

全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务