LeetCode.42. 接雨水

题目

题目链接

分析

读完本题以及结合题目给出的图我们可以很直观的看到,这道题目是让我们求形成凹槽的面积。

我们可以针对每一个数字形成凹槽的面积进行计算,然后相加数组每一个数字形成凹槽的面积即可。

那么问题来了,怎么知道一个数字是否可以形成凹槽,以及计算形成凹槽的面积。

要想形成凹槽,就必须知道左右两边的最大数,如下图中,1 的左边最大值为2,右边最大值为3,那么针对这个1形成的凹槽面积就是 :min(左边最大值,右边最大值) - heighti利用上面的规则,我们将会得到一个 preArray 数组 和 sufArray数组,preArray 数组这个数组记录每一个数字的左边的最大值,sufArray数组这个数组记录每一个数字的右边的最大值。

下图我展示了 preArray 和 sufArray 数组,以及每一个元素可以形成凹槽的面积:

代码

java 复制代码
class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int[] preArr = new int[n];
        preArr[0] = height[0];
        int[] sufArr = new int[n];
        sufArr[n-1] = height[n-1];
        for(int i = 1;i < n;i ++) {
            preArr[i] = Math.max(preArr[i-1],height[i]);
        }
        for(int i = n - 2;i >= 0;i --) {
            sufArr[i] = Math.max(sufArr[i+1],height[i]);
        }
        int res = 0;
        for(int i = 0;i < n;i ++) {
            res += Math.min(preArr[i],sufArr[i]) - height[i];
        }
        return res;
    }
}

拓展

这道题还可以利用双指针的方法来解答。

定义两个指针 left = 0,right = height.length -1

定义一个前缀最大值 pre_max 和 后缀最大值 suf_max

  • 当前缀最大值 < 后缀最大值 时,那么左边 木桶的能形成凹槽的面积就是 前缀 最大值 - 当前left下标对应的值;然后 left++
  • 当前缀最大值 > 后缀最大值 时,那么右边 木桶的能形成凹槽的面积就是 后缀 最大值 - 当前right下标对应的值;然后 right--
  • 当前缀最大值 = 后缀最大值 时,更新left还是right都可以。
java 复制代码
class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int res = 0;
        int pre_max = 0;
        int suf_max = 0;
        int left = 0;
        int right = n - 1;
        while(left < right) {
            pre_max = Math.max(pre_max,height[left]);
            suf_max = Math.max(suf_max,height[right]);
            if(pre_max < suf_max) {
                res += (pre_max - height[left++]);
            }else {
                res += (suf_max - height[right--]);
            }
        }
        return res;
    }
}
相关推荐
程序员清风7 分钟前
算法题中的边界条件、测试与调试
开发语言·算法·kotlin
砚底藏山河12 分钟前
python量化实操:冷热分层存储
java·开发语言·python·金融
yuniko-n24 分钟前
【JUC】原子类
java
惊讶的猫30 分钟前
Query 改写
java·rag
炘爚31 分钟前
数据结构算法总结
数据结构·python·算法
信誓旦旦的程序猿32 分钟前
【Python量化实战宝典 #18】MACD 金叉死叉手册:DIF、DEA、柱体全拆解(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
Dageno_AI1 小时前
ChatGPT 不再引用 Reddit 之后,还值得在 Reddit 上做 AI 可见度吗?
算法
hetao17338371 小时前
2026-10-25 hetao1733837 的刷题记录
c++·算法
Misnearch1 小时前
第7章 面向对象技术
java·开发语言·软考
weixin_BYSJ19871 小时前
电竞先锋网站---附源码02032
java·vue.js·spring boot·python·django·tomcat·php