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 ;
    }
}

题解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;

 
posted @   依嘫  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示