2021-01-05 | 42. 接雨水
阿新 • • 發佈:2021-01-06
技術標籤:2021 LeetCode每日一題演算法leetcode資料結構jsJavaScript
1. 題目描述
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
示例 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
提示:
- n == height.length
- 0 <= n <= 3 * 104
- 0 <= height[i] <= 105
2. 解題思路
看到這道題,我們自然而然的可以想到木桶效應,每根柱子上的雨水的深度取決於它兩側最高的柱子中較短的那根柱子的長度。
- 如果這個較短的柱子的長度大於當前柱子,那麼雨水的深度就是較短的柱子減去當前柱子的長度;
- 如果這個較短的柱子的長度小於等於當前柱子,那麼雨水的深度就是0。
複雜度分析:
- 時間複雜度:O(n),陣列中每個元素都需要向左右掃描
- 空間複雜度:O(1)
3. 程式碼實現
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
let len = height.length, sum = 0
for(let i = 0; i < len - 1; i++){
// 計算當前柱子左側的最大值
let left = 0
for(let j = i - 1; j >= 0; j--){
left = height[j] >= left ? height[j] : left
}
// 計算當前柱子右側的最大值
let right = 0
for(let j = i + 1 ; j < len; j++){
right = height[j] >= right ? height[j] : right
}
// 計算當前柱子能接的雨水量
if(min > height[i]){
sum += Math.min(left, right) - height[i]
}
}
return sum
};