Leetcode 42.接雨水 JavaScript (Day 3)

js一刷(法一)

javascript 复制代码
var trap = function (height) {
   let ans=0;
   const n=height.length;
   let i=0;
   let j=n-1;
   let left_max=0,right_max=0;
   while(i<j){
    left_max=Math.max(left_max,height[i]);
    right_max=Math.max(right_max,height[j]);
    if(left_max<right_max){
        ans+=left_max-height[i];
        i++;
    }
    else {
        ans+=right_max-height[j];
        j--;
    }

}
 return ans;

};

js一刷(法二)

javascript 复制代码
var trap = function (height) {
    let ans = 0;
    let leftMax = [], rightMax = [];
    leftMax[0] = height[0];
    rightMax[height.length - 1] = height[height.length - 1];
    for (let i = 1; i < height.length; i++)
        leftMax[i] = Math.max(height[i], leftMax[i - 1]);
    for (let i = height.length - 2; i >= 0; i--)
        rightMax[i] = Math.max(height[i], rightMax[i + 1]);

    for (let i = 1; i < height.length - 1; i++) {
        let left_max = leftMax[i], right_max = rightMax[i];
        let s = Math.min(left_max, right_max) - height[i];
        ans += s;

    }
    return ans;

};

核心思想:一开始我想着一大块面积一大块的算,但实现不了。思路来自灵神
将每一索引处看成一个桶,我们要知道他的左边最大高度和 右边最大高度 算出通的面积再次减去索引处本来的高度

javascript 复制代码
let s = Math.min(left_max, right_max) - height[i];

有两种方法,一种是在遍历前,先用两个数组分别记录每个索引处的左边最大值和右边最大值(法二)这种方法空间复杂度高

第二种是双指针,边算最大高度边做累加,对于左边,我们可以明确知道左边的最大高度,但这时候不知道右边,怎么办呢,如果此时left_max<right_max,就可以用于计算了,右边同理
这种方法需要注意循环终止的条件是i<j,而不是i!=j,因为i和j可能会刚好错过,导致无限循环

算法核心

javascript 复制代码
left_max=Math.max(left_max,height[i]);
right_max=Math.max(right_max,height[j]);

leftMax[i] = Math.max(height[i], leftMax[i - 1]);
rightMax[i] = Math.max(height[i], rightMax[i + 1]);

长得有点像递归

相关推荐
Lips61133 分钟前
2026.1.20力扣刷题笔记
笔记·算法·leetcode
我即将远走丶或许也能高飞33 分钟前
vuex 和 pinia 的学习使用
开发语言·前端·javascript
2501_9413297242 分钟前
YOLOv8-LADH马匹检测识别算法详解与实现
算法·yolo·目标跟踪
洛生&42 分钟前
Planets Queries II(倍增,基环内向森林)
算法
爱吃泡芙的小白白1 小时前
Vue 3 核心原理与实战:从响应式到企业级应用
前端·javascript·vue.js
小郭团队1 小时前
1_6_五段式SVPWM (传统算法反正切+DPWM2)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·matlab·dsp开发
小郭团队1 小时前
1_7_五段式SVPWM (传统算法反正切+DPWM3)算法理论与 MATLAB 实现详解
开发语言·嵌入式硬件·算法·matlab·dsp开发
鱼跃鹰飞1 小时前
Leetcode347:前K个高频元素
数据结构·算法·leetcode·面试
bybitq1 小时前
LeetCode236-二叉树的最近公共祖先(LCA)问题详解-C++
算法·深度优先
啊阿狸不会拉杆2 小时前
《数字图像处理》第 7 章 - 小波与多分辨率处理
图像处理·人工智能·算法·计算机视觉·数字图像处理