题解 | #接雨水问题#

接雨水问题

https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f

如何用双指针处理接雨水问题?

  • 当前柱子能否盛水和桶的高度有关,而桶的高度又由左右两个边界的最少那个决定,因此需要双指针来指向数组的首尾边界。
  • 由于柱子能否盛水跟桶的高度有关,所以最短边界的那边才能盛水,因此如果确定了最短边界,就从最短边界那边遍历柱子来确定盛水量,但是如果柱子比边界大就无法盛水了,此时就要更新当前边界,并由当前的两个边界确定新的桶高度,再从新的较低边界那边确定盛水量,如此往复直到两个指针相遇。

参考

https://blog.nowcoder.net/n/cd5a55084e6143bcbe18b83f1cfd4994?f=comment

https://blog.nowcoder.net/n/f47d51aea640480ab45b3f68b444edf5?f=comment

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * max water
 * @param arr int整型一维数组 the array
 * @return long长整型
 */
export function maxWater(arr: number[]): number {
    // write code here
    let water = 0;
    let left = 0;
    let maxL = 0;  // 左边最长的木板宽度
    let maxR = 0;  // 右边最长的木板宽度
    let right = arr.length-1;

    while (left <= right) {
        // 每次更新两边的边界,如果当前柱子比上一次的边界长,则当前柱子充当新的边界,这个柱子的盛水量为0,否则这个柱子的盛水量就是边界减去柱子高度(也就是柱子比边界低时才盛水)
        maxL = Math.max(maxL, arr[left]);
        maxR = Math.max(maxR, arr[right]);
        // 以较短的边界为桶的高度确定当前柱子的盛水量,如果边界比柱子高,当前柱子盛水量为边界减去柱子高度,如果边界比柱子低,当前柱子盛水量为0
        if(maxR > maxL)
            water += maxL - arr[left++];
        else
            water += maxR - arr[right--];
    }

    return water;
}

全部评论

相关推荐

无一技之长怎么办:别去右边,售前,实施,需求分析一起,这是把人当牛马用啊,快跑,这些岗位天花板很低的
点赞 评论 收藏
分享
03-11 10:06
已编辑
河南师范大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务