fucking-algorithm
fucking-algorithm copied to clipboard
如何高效解决接雨水问题 :: labuladong的算法小抄
- 哇咔咔,来打卡
第二题建议补一下正确性证明
第二题,如果 height[left]==height[right] 如何判断是需要移动left 还是移动right 才会出现最优解呢?
@bigyou 相等的话左移右移都可以,因为中间部分的面积肯定没有这两个相等的柱子围成的面积大
打卡
接雨水js版
/**
* @param {number[]} height
* @return {number}
*/
var trap = function (height) {
// 想找到第i个柱子上可以接多少雨水 res[i]
// 先找到右边最高的柱子max_l 找到左边最高的柱子max_r 取min(l,r)-height[i] = res[i]
// 使用备忘录优化
const m = height.length;
let max_l = Array(m), max_r = Array(m);
let res = 0, temp;
// 初始化base case
max_l[0] = height[0];
max_r[m - 1] = height[m - 1];
// max_l[i] 代表第i个柱子左边最大高度是多少
// 按照这个思路把max_l 和max_r 初始化 这块不懂可以画画这个步骤的图就懂了
for (let i = 1; i < m; i++)
max_l[i] = Math.max(height[i], max_l[i - 1]);
for (let i = m - 2; i >= 0; i--)
max_r[i] = Math.max(height[i], max_r[i + 1]);
for (let i = 0; i < m; i++) {
temp = Math.min(max_l[i], max_r[i]) - height[i];
res += temp > 0 ? temp : 0;
}
return res;
};
打卡,感谢楼主!
第一题的备忘录解法,也应该判断min(left_max, right_max)是否大于当前柱子的高度吧?假如min(left_max, right_max)是3,但当前柱子是5,直接相减得-2了,然而应当是0。
第一题为什么移动较矮的指针呢?好难想到。。
check in
@saw008 审题
备忘录解法,l_max[i] 和 r_max[i] 分别代表 height[0..i] 和 height[i..end] 的最高柱子高度。
所以两个max至少是当前柱子height,所以差最小是0