参考官方解题:
1.动态优化暴力法
/**
* @param {number[]} height
* @return {number}
*/
// 对于数组中的每个元素,我们找出下雨后水能达到的最高位置,等于两边最大高度的较小值减去当前高度的值
// 官方阶梯,动态编程
var trap = function(height) {
let max_left = []
let max_right = []
height.forEach((item, index) => {
max_left[index] = index ? Math.max(item, max_left[index - 1]) : item
})
max_right[height.length - 1] = height[height.length - 1]
for(let i = height.length - 2; i >= 0; --i) {
max_right[i] = Math.max(height[i], max_right[i + 1])
}
let ans = 0
for (let i = 0; i < height.length; ++i) {
ans += Math.min(max_left[i], max_right[i]) - height[i]
}
return ans
};
2.双指针法
/**
* @param {number[]} height
* @return {number}
*/
// 使用双指针,重点在于算法思想
var trap = function(height) {
let max_left = 0
let max_right = 0
let left = 0 //指向左边
let right = height.length - 1 //指向右边
let ans = 0
while (left < right) {
if (height[left] < height[right]) {
height[left] > max_left ? (max_left = height[left]) : (ans += max_left - height[left])
left++
} else {
height[right] > max_right ? (max_right = height[right]) : (ans += max_right - height[right])
right--
}
}
return ans
};