算法虐我千百遍,我待算法仍如初恋(七)

来了来了,今天来分享一个力扣上评价困难的题目------接雨水(Leetcode 42题)。当时在写成最多水的容器这道题目的时候,就听说还有道接雨水的题目。今天终于让我见到真实面貌了。话不多说,直接开始正题吧!这道题目的主要的算法思想还是双指针哦!因为我现在专门学习做双指针。

# 手刃算法第八式:接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

题目分析

刚拿到这道题目的时候我就感觉有点摸不到头脑。从示例上可以知道题目的意思,就是看这些坑里面能积多少水。首先我的想法就是,设置一个起始点,然后找到其左边最高的,再找到其右边最高的,然后根据木桶效应,取最短的那边就可以减去它本身的高度就可以得到起始点最多能接多少雨水,然后继续得到下一个起始点能接的雨水量。

emmmm,听着就好麻烦。

看这个图是不是就直观一点了。应该是直观了一点。

这时候就要写代码实现了!

代码实现

通过刚才的算法分析,编写如下的代码:

ini 复制代码
var trap = function(height) {
    let sum = 0;
    let len = height.length - 1;
    for (let i = 1; i < len; i++) {
        let right = i + 1;
        let left = i - 1;
        let maxLeft = height[i];
        let maxRight = height[i];
        while (left >= 0) {
            maxLeft = Math.max(maxLeft, height[left]);
            left--;
        }
        while (right <= len) {
            maxRight = Math.max(maxRight, height[right]);
            right++;
        }
        let waterLevel = Math.min(maxLeft, maxRight);
        sum += Math.max(0, waterLevel - height[i]);
    }
    return sum;
}

通过这个来运行的话还是能运行出来的。

但是!!!服了,提交的时候给我来个这个!

我只能说,6啊!还是我的代码不够完美。哎,可是这已经是我能写的出来的了。

没办法只能去寻求帮助了。

别人家的想法

直接设置左右两个指针,一个指针指向数组头部,一个指针指向数组尾部,然后 设置两个变量分别记录左右两边的最大高度。如果左边的高度小于右边的高度,则用左边的最大高度减去左边当前的高度就是此时这个格子能接到的雨水量。相反就用右边最大高度减去右边当前的高度。语言表达能力有限,感觉讲清楚了,有感觉没有说清楚。 还是看图说话吧!!!

他这个想法和我的是差不多的,但是还是挺猛的!这样就不需要用两个循环了,一个循环就搞定了。

具体代码实现

ini 复制代码
var trap = function(height) {
    if (height.length === 0) return 0;
    
    let left = 0, right = height.length - 1; 
    let maxLeft = 0, maxRight = 0; 
    let sum = 0; // 初始化积水总量

    while (left < right) {
        if (height[left] <= height[right]) {
            maxLeft = Math.max(maxLeft, height[left]);
            sum += maxLeft - height[left];
            left++;
        } else {
            maxRight = Math.max(maxRight, height[right]);
            sum += maxRight - height[right];
            right--;
        }
    }
    return sum;
}

在回过头来看我写的代码,就跟现在看小学生的作文一样。我咋就想不到呢,同样都是双指针,咋差距这么大。难受了~

学到了学到了!以后再碰到要学会这样!

结语

这道题目说实话对我来说还是有难度的,不过当理清楚了还是可以拿下的。虽然我的代码比较low,但是最起码写出来了,也算是个进步吧!在b站上学习这个,好像说还有一种单调栈的方法,emmm,单调栈是啥,有没有大佬可以给解答一下的。今晚就到这里,晚安啦,明天也要努力哦!

相关推荐
musk12126 分钟前
electron 打包太大 试试 tauri , tauri 安装打包demo
前端·electron·tauri
考虑考虑30 分钟前
Springboot3.4.x中的@Bean使用
spring boot·后端·spring
努力的小雨30 分钟前
AI编程实战:云开发疯狂助攻,React + Vite 做出 FPS 网页游戏不是梦
后端
翻滚吧键盘35 分钟前
js代码09
开发语言·javascript·ecmascript
万少1 小时前
第五款 HarmonyOS 上架作品 奇趣故事匣 来了
前端·harmonyos·客户端
OpenGL1 小时前
Android targetSdkVersion升级至35(Android15)相关问题
前端
rzl021 小时前
java web5(黑马)
java·开发语言·前端
Amy.Wang1 小时前
前端如何实现电子签名
前端·javascript·html5
海天胜景1 小时前
vue3 el-table 行筛选 设置为单选
javascript·vue.js·elementui
今天又在摸鱼2 小时前
Vue3-组件化-Vue核心思想之一
前端·javascript·vue.js