• 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
  • 相关阅读:
    漫画风格迁移神器 AnimeGANv2:快速生成你的漫画形象
    静态住宅代理是什么?为什么要选择它?
    单源赋权最短路径
    KeyDB源码解析四——其他特性
    优思学院|为何CPK要大于1.33?
    【读书笔记】【More Effective C++】技术(Techniques,Idioms,Patterns)
    Flink CDC 实现Postgres到MySQL流式加工传输案例
    索引初识
    【MySql】2- 基础篇(下)
    HTTP状态码504(Gateway Timeout)报错原因分析和解决办法
  • 原文地址:https://blog.csdn.net/qq_41810415/article/details/126815124