1. 程式人生 > >LeetCode 42. 接雨水 (從兩邊往中間搜尋)

LeetCode 42. 接雨水 (從兩邊往中間搜尋)

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。

上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 感謝 Marcos 貢獻此圖。

示例:

輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6

方法一(執行超時):

思路:按層數統計 每層遍歷  O(n3)

class Solution {
//     思路:按層數統計 每層遍歷 從第一個大於等於k的開始 從下一個大於等於k的結束
    public int trap(int[] height) {
//         判空
        if(height.length==0) return 0;
//         先取出陣列的最大值和最小值
        int max=height[0];
        int min=height[0];
        for(int i=0;i<height.length;i++){
            max=height[i]>max?height[i]:max;
            min=height[i]>min?min:height[i];
        }
        int sum=0;
        for(int i=min+1;i<=max;i++){
            int pre=-1;
            int next=-1;
            for(int index=0;index<height.length;index++){
                if(height[index]>=i && pre==-1){
                    pre=index;
                    next=pre;
                }
                if(height[index]>=i && pre!=-1){
                    next=index;
                }
            }
            for(int j=pre+1;j<next;j++){
                if(height[j]<i){
                height[j]+=1;
                sum+=1;
                }
            }
        }
         return sum;
    }
}

 

方法二:

思路:木桶原理 乘多少水由最小值決定 從兩邊往中間搜尋(實質是向最大值靠近 分為左右兩邊分別統計) O(n)

class Solution {
//     思路:木桶原理 乘多少水由最小值決定 從兩邊往中間搜尋(實質是向最大值靠近 分為左右兩邊分別統計)
    public int trap(int[] height) {
//         判空
        if(height.length==0) return 0;
//         左右向中間搜尋
        int left=0;
        int right=height.length-1;
        int sum=0;
//         儲存區域性最大值
        int secHeight=0;
        while(left<right){
            if(height[left]<height[right]){
                secHeight=secHeight>height[left]?secHeight:height[left];
                sum+=secHeight-height[left];
                left++;
            }
            else{
                secHeight=secHeight>height[right]?secHeight:height[right];
                sum+=secHeight-height[right];
                right--;
            }
        }    
         return sum;
    }
}