lintcode:接雨水


接雨水

給出 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 }
Java Code

 

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
Python Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM