1. 程式人生 > 其它 >42. Trapping Rain Water

42. Trapping Rain Water

技術標籤:Two Pointerleetcode

42. Trapping Rain Water
categories: [LeetCode]
tags: [array, two poiners, easy]

42. Trapping Rain Water

題目大意:

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

解題思路:

 這道題我們可以用雙指標一次遍歷去做,我們分別用left和right代表陣列兩端
 同時初始化三個自變數ans,leftmax 和rightmax代表最後答案,左邊最大蓄水量,右邊最大蓄水量
 然後開始用while loop迴圈,條件是left < right
 如果當前left柱子的高度小於right柱子的高度,
    我們需要繼續判斷如果當前left柱子高度大於等於
    當前左邊最大蓄水量leftmax,我們需要更新一下leftmax使其等於當前left柱子的高度
    否則則說明當前left柱子高度下於leftmax,則當前需水量ans += leftmax - left柱子的高度
    無論left高度和leftmax比較如何,我們都需要將left指標挪到下一個left++
如果當前left的高度大於等於right的高度,我們則需要更新rightmax和看看right這邊有沒有可以蓄水的
    同樣的,如果right高度大於等於rightmax,rightmax 更新為right高度
    否則說明當前right高度小於rightmax, 可以蓄水,蓄水量為ans += rightmax - right高度
    無論right高度和rightmax比較如何,right指標都移到下一個right--
while loop結束,最後返回ans
注意: ans初始化要在while loop之前

注意:

None

複雜度:

Time Complexity:O(N)
Space Complexity: O(1)

Code示例:

class Solution {
    public int trap(int[] height) {
        int left = 0, right = height.length - 1;
        int ans = 0;
        int left_max = 0, right_max = 0;
        while (left < right) {
            if (height[left] < height[right]) {
                if (height[left] >= left_max) {
                    left_max = height[left];
                } else {
                    ans += (left_max - height[left]);
                }
                ++left;
            } else {
                if (height[right] >= right_max) {
                    right_max = height[right];
                } else {
                    ans += (right_max - height[right]);
                }
                --right;
            }
        }
        return ans;
    }
}