給出 n 個非負整數,代表一張X軸上每個區域寬度為 1
的海拔圖, 計算這個海拔圖最多能接住多少(面積)雨水。
如上圖所示,海拔分別為 [0,1,0,2,1,0,1,3,2,1,2,1]
, 返回 6
.
解題
先遍歷一遍找到最高點,然后分別從兩邊開始,往最高點所在位置遍歷,水位只會增高不會減小,且一直和最近遇到的最大高度持平,這樣知道了實時水位,就可以邊遍歷邊計算面積。
左到最高點,海拔高度下降的時候計算水位,左邊最近比他高的海拔 減去 自己的海拔 ,這是該海拔的水位量。當遇到更高的海拔的時候更新海拔高度。
右到最高點,海拔高度下降的時候計算水位, 右邊最近比他高的海拔 減去 自己的海拔 ,這是該海拔的水位量。當遇到更高的海拔的時候更新海拔高度。

1 public class Solution { 2 /** 3 * @param heights: an array of integers 4 * @return: a integer 5 */ 6 public int trapRainWater(int[] A) { 7 // write your code here 8 int n = A.length; 9 if(n <= 2) return 0; 10 int max = -1, maxInd = 0; 11 int i = 0; 12 for(; i < n; ++i){ 13 if(A[i] > max){ 14 max = A[i]; 15 maxInd = i; 16 } 17 } 18 int area = 0, root = A[0]; 19 for(i = 0; i < maxInd; ++i){ 20 if(root < A[i]) root = A[i]; 21 else area += (root - A[i]); 22 } 23 for(i = n-1, root = A[n-1]; i > maxInd; --i){ 24 if(root < A[i]) root = A[i]; 25 else area += (root - A[i]); 26 } 27 return area; 28 } 29 }

class Solution: # @param heights: a list of integers # @return: a integer def trapRainWater(self, A): # write your code here n = len(A) if(n <= 2): return 0 max = -1 maxInd = 0 for i in range(n): if A[i]> max: max = A[i] maxInd = i leftMax = A[0] area = 0 for i in range(maxInd): if leftMax < A[i]: leftMax = A[i] else: area = area + leftMax - A[i] rightMax = A[n-1] for i in range(n-1,maxInd,-1): if rightMax< A[i]: rightMax = A[i] else: area = area + rightMax - A[i] return area