高编课后作业------第八周-LeetCode

42接雨水   分类Array


就是算这个蓝色区域的大小。

一开始看这题感觉很容易,然后尝试找了很多规律,比如桶两边都是“塔尖”样子的,右边比左边高等等多个判断,然后交了几次总是只能过掉一半左右的测试..... 可能我不是很懂木桶装水把=。=

后来还是看了题解,做法是:在最左端和最右端各设置一个指针,然后往中间靠拢,统计出答案。根据短板原理,装水的多少取决于两边中较短的板。而对于两块板,中间总是可以装水的,可以假设其中总是装满水,然后在指针靠拢的过程中,如果碰到高度比两边低的,就把高度减掉,因为这部分不能装水。另外如果碰到比原来还高的,就要用那个更高的板,装更多的水,因此还需要维护两边中最高的板。而在更新最高板之前,之前的最高板与新更新的最高板之间构成的“桶”中,短板一定是之前的最高板,所以算法是对的。说的有点乱.....

lefttop: 左边最高板的高度

righttop:右边最高板的高度

lp:左指针

rp:右指针

class Solution:
    def trap(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        n = len(height)
        if n<3:
            return 0
        lefttop = height[0]      
        righttop = height[n-1]
        lp = 1
        rp = n-2
        ans = 0
        while(lp<=rp):
            if lefttop<righttop:
                if lefttop<height[lp]:
                    lefttop = height[lp]
                else:
                    ans += lefttop - height[lp]
                lp += 1
            else:
                if righttop<height[rp]:
                    righttop = height[rp]
                else:
                    ans += righttop - height[rp]
                rp -= 1
        return ans
        #return ans

猜你喜欢

转载自blog.csdn.net/syyjiang/article/details/80077564