Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

  • 堆栈队列

    • 394.字符串解码
    • 32. 最长有效括号
    • 739. 每日温度
    • 1130. 叶值的最小代价生成树
    • 84. 柱状图中最大的矩形
    • 42.接雨水
      • 1.双指针法
      • 2.单调栈
    • 85. 最大矩形
    • 239.滑动窗口最大值
    • 6891. 机器人碰撞
    • 445. 两数相加 II
    • 2762. 不间断子数组
    • 6919. 使数组中的所有元素都等于零
    • 862. 和至少为 K 的最短子数组
    • 1499. 满足不等式的最大值
    • 2856. 删除数对后的最小数组长度
    • 901. 股票价格跨度
    • 2034. 股票价格波动
    • 1488. 避免洪水泛滥
    • 2940. 找到 Alice 和 Bob 可以相遇的建筑
    • 2454. 下一个更大元素 IV
  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 堆栈队列
phan
2023-05-16
目录

42.接雨水

# 42.接雨水

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

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6

# 1.双指针法

解题关键在于思考,height[i]这个位置上能够接多少雨水?它等于 i 这个位置左边最大高度和右边最大高度之间的最小值减去当前高度。因此问题就转化为了求解每个位置上左边最大高度和右边最大高度。

  • 第一次for右往左遍历,记录下每个节点右边的最大值,并开辟一个数组保存在其中。第二次for左往右遍历找出每个节点左边的最大值,并计算面积。

  • 用双指针,当前节点能接多少雨水取决于左右两边最大值的最小值,设置左指针left和右指针right,通过左指针维护左边最大值leftmax,右指针维护右边最大值。当leftmax<rightmax,就可以判断left位置节点能接多少水了,此时虽然rightmax不一定是left节点的右边最大值,但是leftmax一定是它的左边最小值(因为指针从边界开始维护),并且leftmax一定是小于left节点右边最大值。left节点确定后,再向右移动。这里比较难想到的是每次确定结果的位置是在指针的一侧,而不需要left和right相碰。

# 2.单调栈

维护一个自栈底到栈顶元素依次递减的单调栈,栈内保存每个索引元素的下标。

根据当前元素若大于栈顶元素,则计算蓄水面积。每次计算雨水面积时栈内大小至少为2:

  • 出栈,计算蓄水深度depth
  • 读取当前栈顶元素索引,计算蓄水宽度width

可以发现,单调栈的做法每次计算的雨水区域都是一个矩形区域,计算时只依赖于栈内保存的左右边界索引,从而得到长方形的宽,即使某个元素出栈了也不会影响在该位置上可蓄水面积的计算。

class Solution {
    public int trap(int[] height) {
        int res=0;
        int max=Integer.MIN_VALUE;
        Stack<Integer> stack=new Stack<>();
        stack.push(0);
        for(int i=1;i<height.length;i++){
            while(stack.size()>0&&height[stack.peek()]<=height[i]){
                    int currinx=stack.pop();
                    if(stack.size()==0) break;
                    int depth=Math.min(height[i],height[stack.peek()])-height[currinx];
                    res+=(i-stack.peek()-1)*depth;
            }
            stack.push(i);
        }
        return res;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
编辑 (opens new window)
#Leetcode#双指针法#堆栈队列
上次更新: 2023/12/15, 15:49:57
84. 柱状图中最大的矩形
85. 最大矩形

← 84. 柱状图中最大的矩形 85. 最大矩形→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式