【leetcode】42.接雨水js

文章目录

题目

代码

核心是短板原理:

接的雨水 = min(maxLeft, maxRight) - heighti

但要怎么体现在代码里呢?一开始想的是Math.min(),但学习的时候发现题解里min的影都没见到,而是对比height[left]和height[right]就可以实现对maxLeft和maxRight的对比。解释如下(来自d老师):

当你确定某一边是短板时,你就能断定:这一侧当前的 Max(最大值)一定就是全局的 min。

我们分情况证明(以左边为例):

当height[left] < height[right]成立时(左边是短板):

  1. 因为rightMax >= height[right](右侧最大值至少是当前这根右柱子),所以rightMax > height[left]。
  2. 关键来了:此时 leftMax 必然小于或等于 rightMax。
    为什么?用反证法------如果左边的最大值(leftMax)比右边的最大值(rightMax)还大,说明左边有一堵"超级高墙"。按照"移动短板"的规则,当指针还停留在那堵超级高墙时,因为它比右边的所有墙都高,算法会一直移动右指针向左靠拢,直到左右指针相遇,游戏结束------左指针压根儿没机会走到现在这个位置。
    既然左指针走到了这里,就说明左边不存在比右边整体更高的墙,所以 leftMax <= rightMax。
js 复制代码
/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    // 接的雨水 = min(maxLeft, maxRight) - height[i]
    let maxLeft = 0, maxRight = 0;
    let left = 0, right = height.length - 1;
    let res = 0;

    while (left < right) {
        if (height[left] < height[right]) {
            maxLeft = Math.max(height[left], maxLeft);
            res += maxLeft - height[left];
            left++;
        } else {
            maxRight = Math.max(height[right], maxRight);
            res += maxRight - height[right];
            right--;
        }
    }
    return res;
};
相关推荐
xiaoye-duck4 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
nice_lcj5206 小时前
Java Lambda 表达式入门:怎么写、怎么用、常用方法有哪些
java·开发语言·后端·面试
码农小河667 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
系统集成-鹰翔7 小时前
ERP图片改名后仍命中识别缓存:缓存键、十分钟到期与调用计数
javascript·经验分享·后端
FlyWIHTSKY9 小时前
vue2和vue3有什么区别,用法上有哪些区别
前端·javascript·vue.js
程序员大阳10 小时前
副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发
javascript·json·实战·待办事项·本地存储·案例
Dream-Y.ocean11 小时前
鸿蒙PC平台逻控 PLC 编辑器适配实战:基于 Electron 壳方案的纯 JavaScript 梯形图编程与仿真引擎开发
javascript·编辑器·harmonyos
nice_lcj52011 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐11 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm12 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库