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