leetcode-42-trapping-rain-water
題目
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.
Example 1
1 | Input: height = [0,1,0,2,1,0,1,3,2,1,2,1] |
Example 2
1 | Input: height = [4,2,0,3,2,5] |
Constraints:
- n == height.length
- 1 <= n <= 2 * 104
- 0 <= height[i] <= 105
解釋題目
題目會給一個陣列,陣列值代表牆的高度,題目假設牆的寬度都是 1。牆跟牆之間可以儲水,最後要計算所有牆面可以儲多少水。
思路 (1) 雙指針
- 陣列是由一道一道牆所建立的,想像灌滿水,不讓水流出的關鍵是左右兩側的牆
- 左右兩側的牆分別代表兩個指針,並且會相向移動。
- 矮牆的那一端,就可以先計算水量,因為水會從矮的那一側流出。
- 透過雙指針的相向移動,可以逐步比較兩側牆的高度。
- 所以透過比較每次左右兩道牆,可以確保水一定不會外流。
- 因為前面這個前提,所以可以逐步計算矮邊的水量。
- 若左牆較矮,當下的牆 (左牆) 可以跟 left_max ( 左高牆 ) 比較,相差值即為可以裝的水量。
- 即便左右之間的牆都矮於左牆 => 水也不會流出
- 即邊中間有高於右邊的牆 => 水也不會流出
- left_max 的初始值是左邊第一道牆,所以通常不能儲水是正常的。
- 左邊計算完水量,指針要往右移一步。
- 右邊是一樣的邏輯。
思路 (2) DP
- DP 的想法比較簡單,就是暴力地去計算每道矮牆的左右兩側牆高的陣列,left_max 跟 right_max。
- 然後因為知道每道牆的左邊最高 (
left_max[i]
) 跟右邊最高 (right_max[i]
),就可以計算水量 - 當前牆高的水量的計算就是
left_max[i]
跟right_max[i]
取小值,減去當前牆高 (height[i]
),如果當前牆超級高,就不能存水,水為 0 不能為負。 - left_max 初始值為
height[0]
;right_max 初始值為height[n - 1]
程式碼 (1)
1 | class Solution: |
程式碼 (2)
1 | class Solution: |
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 雜耍特技師!