42. Trapping Rain Water
两个问题:
When the column can trap water? --> height[i] < min(leftMax, rightMax)
How much water it can trap? --> min(leftMax, rightMax) - height[i]
暴力解法就是对每个点都往左往右找max,然后左右两个max里取较小的那一个作为限高边,时间复杂度在O(n**2),但也可以提交。
既然是遍历array然后依靠左右max求解,那可以先遍历记录各个位置的左右max,再取遍历array记录解来求和,整个遍历三次。有点像Q238:
238. Product of Array Except Self如果某个点i
的 left max 小于等于它右边某个点j
的 right max,那点i
的left max 当然也小于i
自己的right max(因为 right max 在从右向左探索的过程中是递增的),由此可以优化出双指针的解法。也可以说这是个双sliding window,[maxL, l]
和 [r, maxR]
两个窗口。
class Solution:
def trap(self, height: List[int]) -> int:
if len(height) <= 2: return 0
res = 0
for i in range(1,len(height)-1):
maxL, maxR = max(height[:i]), max(height[i+1:])
gap = min(maxL, maxR) - height[i]
res += max(0, gap)
return res
Last updated
Was this helpful?