题目
Given n
non-negative integers representing an elevation map where the width of each bar is 1
, compute how much water it can trap after raining.
Example 1:
Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
Explanation: The above elevation map (black section) is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.
Example 2:
Input: height = [4,2,0,3,2,5]
Output: 9
Constraints:
n == height.length
0 <= n <= 3 * 104
0 <= height[i] <= 105
解法
解法一:
这个和11. Container With Most Water的解法非常像。
真是巧妙,O(n)时间复杂度,O(1)空间复杂度。我自己用的方法,时间复杂度是.这个解法之所以可以做到O(n),比起我的算法,改进的地方是从两头往中间遍历。每次依据比较矮的一边来计算(left<=right),因为类似木桶理论,矮的一边决定了最多可以装多少水。而我自己的算法是针对每个元素,分别找它左边或者右边的最大值,这样复杂度就是了。
开始看这个解法,我会担心较矮的一边用maxleft/maxright去减,另一边的最高高度不够。后来考虑到另一边的max高度肯定是大于等于矮的这边的max的。因为从两边开始,都是优先选矮的去处理的。
class Solution {
public:
int trap(int A[], int n) {
int left=0; int right=n-1;
int res=0;
int maxleft=0, maxright=0;
while(left<=right){
if(A[left]<=A[right]){
if(A[left]>=maxleft) maxleft=A[left];
else res+=maxleft-A[left];
left++;
}
else{
if(A[right]>=maxright) maxright= A[right];
else res+=maxright-A[right];
right--;
}
}
return res;
}
};
解法二:
我自己用的方法,复杂度
class Solution:
def trap(self, height: List[int]) -> int:
result=0
for i in range(1,len(height)-1):
max_left=0
for j in range(0,i):
if(height[j]>max_left):
max_left=height[j]
if(max_left<=height[i]):
continue
max_right=0
for j in range(i+1,len(height)):
if(height[j]>max_right):
max_right=height[j]
if (max_right <= height[i]):
continue
result+=min(max_left,max_right)-height[i]
return result