fucking-algorithm icon indicating copy to clipboard operation
fucking-algorithm copied to clipboard

如何高效解决接雨水问题 :: labuladong的算法小抄

Open utterances-bot opened this issue 3 years ago • 10 comments

文章链接点这里:如何高效解决接雨水问题

评论礼仪 见这里,违者直接拉黑。

utterances-bot avatar Jan 29 '22 06:01 utterances-bot

  • 哇咔咔,来打卡

deepbreath373 avatar Jan 29 '22 06:01 deepbreath373

第二题建议补一下正确性证明

fornobugworld avatar Feb 17 '22 13:02 fornobugworld

第二题,如果 height[left]==height[right] 如何判断是需要移动left 还是移动right 才会出现最优解呢?

bigyou avatar Mar 02 '22 04:03 bigyou

@bigyou 相等的话左移右移都可以,因为中间部分的面积肯定没有这两个相等的柱子围成的面积大

yarkable avatar Apr 16 '22 14:04 yarkable

打卡

cheng-miao avatar Apr 26 '22 07:04 cheng-miao

接雨水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;
};

Leochens avatar May 24 '22 02:05 Leochens

打卡,感谢楼主!

lihuagang03 avatar Jun 02 '22 16:06 lihuagang03

第一题的备忘录解法,也应该判断min(left_max, right_max)是否大于当前柱子的高度吧?假如min(left_max, right_max)是3,但当前柱子是5,直接相减得-2了,然而应当是0。

saw008 avatar Jun 23 '22 03:06 saw008

第一题为什么移动较矮的指针呢?好难想到。。

massiachan avatar Jun 26 '22 12:06 massiachan

check in

deepbreath373 avatar Aug 03 '22 14:08 deepbreath373

@saw008 审题

备忘录解法,l_max[i] 和 r_max[i] 分别代表 height[0..i] 和 height[i..end] 的最高柱子高度。

所以两个max至少是当前柱子height,所以差最小是0

Hyuvo avatar Aug 25 '22 21:08 Hyuvo