LeetCode42. 接雨水(第二篇)

LeetCode42. 接雨水(第二篇)

上一篇博客,是按照行,層層向上,計算。我覺得沒什麼問題,但是沒通過。因爲用例太長還沒能在本地自測

  • 這個的思路是當前列能存儲多少水
    當前列存儲能存儲多少水取決於:左邊最高柱子,和右邊最高的柱子,以及自己的底部
    可以想象,當柱子數組長度小於3(height.length<=2),無法裝水,直接返回0
    能裝多少水,取決一左右最高峯最短的,較矮的那個int temp = Math.min(leftHigh,rightHigh) - height[i];,減去底部,就是裝水的容量。(如果是負或者0代表無法裝水)

好了現在思路就很清楚了,我們只需要知道三個數據,左邊最高峯leftHigh,右邊最高峯rightHigh,當前底部height[i]就能求出當前列能裝多少水

把所有的的當前列(height[1],到倒數第二列)求和,就得出一共的容量

執行結果:通過
執行用時 :130 ms, 在所有 Java 提交中擊敗了5.06% 的用戶
內存消耗 :39.9 MB, 在所有 Java 提交中擊敗了11.78% 的用戶

可以看出我的算法,效率不高,但是:要啥自行車!要啥手錶
先填飽肚子再說吧

  • 代碼如下:
class Solution {
    public int trap(int[] height) {
        //長度爲小於2直接返回
        if (height.length<=2)
            return 0;
        //來自題解的思路 按列求
        //左邊最高的牆
        int leftHigh = 0;
        //右邊最高的牆
        int rightHigh = 0;
        //水容量
        int waterSum = 0;

        for (int i = 1; i<height.length-1; i++){

            leftHigh = maxHigh(height,0,i);
            rightHigh = maxHigh(height,i+1,height.length);
            //能裝多少水取決於最短的板 再減去底部
            int temp = Math.min(leftHigh,rightHigh) - height[i];
            if (temp>0){
                waterSum += temp;
            }
        }
        return waterSum;
    }
    //找出該區間最大的值
    int maxHigh(int[] height, int left,int right){
        int temp=0;
        for (int i=left;i<right;i++){
            if (temp<height[i]) temp=height[i];
        }
        return temp;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章