• 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
  • 相关阅读:
    【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码
    成功解决ValueError: Only TF native optimizers are supported in Eager mode
    【云原生】Docker镜像、容器、仓库、配置等常见问题汇总(面试必看)
    谷粒商城-基础篇(详细流程梳理+代码)
    我们来浅谈代码语言的魅力
    第二十五届全国青少年信息学奥林匹克联赛初赛
    洛谷P8395 Good Fours and Good Fives
    教你一招,轻松实现heic转换
    Swift基础
    HiveQL
  • 原文地址:https://blog.csdn.net/qq_41810415/article/details/126815124