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

解題思路:利用兩個輔助陣列left[]和right[]

left[i]、right[i]分別表示i位置左邊所有數的最大值和i位置右邊所有數的最大值,

若height[i] < left[i] && height[i] < right[i],則i位置積水,且積水量為min(left[i], right[i]) - height[i]

java程式碼:

class Solution {
    public int trap(int[] height) {
        int len = height.length;
        int[] left = new int[len], right = new int[len];
        for(int i = 1; i < len; i++)
            left[i] = Math.max(left[i-1], height[i-1]);
        for(int i = len - 2; i >= 0; i--)
            right[i] = Math.max(right[i+1], height[i+1]);

        int result = 0;
        for(int i = 0; i < len; i++){
            if(height[i] > left[i] || height[i] > right[i])
                continue;
            result += Math.min(left[i], right[i]) - height[i];
        }

        return result;
    }
}

個人的一點想法:其實沒太弄明白這道演算法題的核心點在哪,這種解法給我的感覺有點像高等數學裡面的微積分,求導數的時候用的思路,但是又不完全一樣,剛剛看了一下這道題的相關話題是棧、陣列、雙指標,用棧應該也可以解,但是目前還沒想到用棧的解法,後續如果想到了解法會再更新。

參考文章:https://blog.csdn.net/Bendaai/article/details/80116069