• leetcode 42. 接雨水-java


    题目所属分类

    单调栈的做法 本文提供了两种写法和解释

    原题链接

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

    代码案例:在这里插入图片描述

    输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
    输出:6
    解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

    题解1

    在这里插入图片描述
    在这里插入图片描述

    • 先遍历每个的高度 前三个入栈 栈里面存的都是新来元素的下标 然后栈顶元素小于新加入的元素 栈顶元素出栈
    • 如果说栈里面还有元素 那么咱们需要的面积就是 底乘高
      底:当前遍历到的i - 现在栈顶元素-1
      高:首先新来的元素与当前栈的元素取最小 得出h1 (其实是为了知道A和B 二者中的最小) 然后h1与第一步出栈的元素相减 得出H
      面积就是 底* H
    • 答案要累加起来 当栈顶元素大于新来的元素时 栈里面添加元素
    • 最后输出答案
    class Solution {
        public int trap(int[] height) {
            int n = height.length;
            int res = 0 ;
            Stack<Integer> s = new Stack<>();
            for(int i = 0 ; i < n ; i++){
                while(s.size() > 0 &&  height[s.peek()] <= height[i] ){
                    int t = s.pop();
                    if(s.size()>0){
                        int h = Math.min(height[s.peek()] , height[i]);
                        res += (i - s.peek() -1 )* (h-height[t]) ;//底乘高
                    }
                }
                s.push(i);
            }
            return res ;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    题解2

    这里面是分成了两部分内容 对上面的内容进行了拆解
    当栈顶元素小于新来的元素的时候 ( last指的是现在栈的栈顶元素)

    • 出栈 然后面积的高 为原来和现在的栈顶元素之差
    • 等height[stack.peek()] > height[i]后来的面积的高为新来元素和现在栈顶元素的差
        Stack<Integer> stack = new Stack<>();
        int result = 0;
        for (int i = 0; i < height.length; i++) {
            int last = 0;//这里面指的是现在栈的栈顶元素
            while (stack.size() != 0 && height[stack.peek()] <= height[i]) {
                result += ((height[stack.peek()] - last) * (i - stack.peek() - 1));
                last = height[stack.peek()];//更新成现在栈顶元素
                stack.pop();
            }
            if (stack.size() != 0) {
                result += ((height[i] - last) * (i - stack.peek() - 1));
            }
            stack.push(i);
        }
        return result;
    
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Redis 集群搭建--Linux 开发三主三从
    基于机器学习、遥感和Penman-Monteith方程的农田蒸散发混合模型研究_刘燕_2022
    机器学习中的 K-均值聚类算法及其优缺点
    【数据挖掘工程师-笔试】2022年大华股份
    Ef Core花里胡哨系列(10) 动态起来的 DbContext
    Python使用turtle绘制简单图形
    vm虚拟机安装debian NAT模式 桥接模式 究竟是什么意思
    Git进阶命令-reset
    React魔法堂:echarts-for-react源码略读
    文件操作——IO(代码演示)
  • 原文地址:https://blog.csdn.net/qq_41810415/article/details/126815124