leetcode 42.接雨水
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)
读题
对于当前位置[3],雨水能达到的最大高度等于[3]两边的最大高度的最小值(类似短板),[3]处能接的雨水等于[3]处的水能达到的最大高度减去height[3],即[3]处的雨水高度等于 min(1,3) - 0 = 1- 0 = 1
思路
如果我们对于每一个位置都进行一次查找两侧最大高度的操作,height的长度为n,那么时间复杂度为O(n^2),显然会超时,所以要进行优化。
如果将每个位置左侧和右侧的最大值先存起来,那么就只需要在每个位置进行比较,选取左侧最大值和右侧最大值的较小值减去当前位置的高度,时间复杂度为O(n),由于需要将每个位置的左侧和右侧最大值存起来,故需要两个大小为height长度的空间,空间复杂度为O(n)。
第i个位置的左侧最大值可以用max(LeftMax[i-1], height[i])
来确定,故从左往右遍历,就能得到LeftMax[]。
类似的右侧的最大值可以用max( height[i] , RightMax[i+1])
来确定,所以从右往左遍历,就能得到RightMax[]。
得到两个数组后,再次遍历,对每个位置选取两边的最大高度的最小值,即min(LeftMax[i],RightMax[i])
与当前高度作差就能得到当前位置的雨水量,最后将每个位置的雨水量求和就得到了最后的答案。
源码:
class Solution