題目連結:
題目意譯:
給定 n 個非負整數代表著每個長條寬度為 1 的標高圖,計算其下雨後可以捕獲多少的水。
限制:
n == height.length
1 ≦ n ≦ 2 × 10 ^ 4
0 ≦ height[i] ≦ 10 ^ 5
範例測資:
範例 1:
輸入: height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
解釋: 上列標高圖(黑色區域)表為陣列 [0,1,0,2,1,0,1,3,2,1,2,1]。在此例中,6 單位的雨水(藍色區域)被捕獲。
範例 2:
輸入: height = [4,2,0,3,2,5]
輸出: 9
解題思維:
定義兩個指標 L 、 R,前者指向 height[0](開頭)、後者指向 height[n - 1](結尾)。再定義三個變數 Lmax 、 Rmax 、 T,依序代表目前指標 L 遇到過的 height[L] 最大值、目前指標 R 遇到過的 height[R] 最大值,以及被捕獲水之總單位數,這三個變數初始值皆為 0。
接著重複以下步驟直到 L 等於 R 為止:
先判斷 height[L] 與 height[R] 的大小關係。
當 height[L] < height[R] 時,我們先判斷 height[L] 是否大於或等於 Lmax。如果是,則更新 Lmax 之值為 height[L];反之,則此時代表著我們在 Lmax 發生的位置到 height[R] 中間發現了一個坑洞。有了坑洞就可以捕獲水,因此該坑洞捕獲的水量為 Lmax - height[L]。最後我們將 L 加 1,代表指標 L 往右移動。
當 height[L] > height[R] 時,我們先判斷 height[R] 是否大於或等於 Rmax。如果是,則更新 Rmax 之值為 height[R];反之,則此時代表著我們在 height[L] 到 Rmax 發生的位置中間發現了一個坑洞。有了坑洞就可以捕獲水,因此該坑洞捕獲的水量為 Rmax - height[R]。最後我們將 R 減 1,代表指標 R 往左移動。
當 height[L] = height[R],隨便挑上述兩種情況做其中一個即可。
因此這樣便可以正確地判斷每一個位置應捕獲多少單位的水,而這些水的總量即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。