首页 > 其他分享 >吃透单调栈(2)——解两道Hard题:接雨水、柱状图中最大的矩形问题

吃透单调栈(2)——解两道Hard题:接雨水、柱状图中最大的矩形问题

时间:2023-09-03 16:00:24浏览次数:36  
标签:柱子 吃透 int top Hard stk 柱状图 height heights

怎么想到要用单调栈的?

这类题目的数据通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己或者的元素的位置(寻找边界),此时我们就要想到可以用单调栈了。

 

42. 接雨水

这道题就是要求解每一个柱子左边第一个比它高的柱子,以及右边第一个比它高的柱子,然后这两个柱子间形成的凹槽面积。

注意,是横向扫来求面积。比如下图,4号柱左边第一个比它高的柱子是3号,右边第一个比它高的是7号,面积是蓝色框(遍历到7号柱时才会计算面积)。

我们额外用一个栈来存储左边第一个更高柱子的编号(为什么是左边,因为用for循环遍历是从左边开始的,左边代表遍历过了的信息)。

右边第一个更高的柱子会出现在for循环遍历时,见下面的case 3。

 在用for循环遍历每一跟柱子时,会出现以下三种情况,我们要根据不同情况来选择如何操作栈。

  • case 1:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]
  • case 2:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]
  • case 3:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]   (碰到了右边第一个更高的柱子)

 

    int trap(vector<int> &height)
    {
        int ans{0};
        stack<int> stk; // 单调递增栈

        for (int i = 0; i < height.size(); ++i)
        {
            while (!stk.empty() && height[i] > height[stk.top()]) // case 3
            {
                int right = i;
                int mid = stk.top();
                stk.pop();
                if (!stk.empty())
                {
                    int left = stk.top(); // 弹出mid后,栈顶元素就是mid左侧第一个比它高的柱子
                    // 计算面积
                    int width = right - left - 1;
                    int h = min(height[left], height[right]) - height[mid];
                    ans += width * h;
                }
            }
            // case 1&2
            stk.push(i);
        }
        return ans;
    }

 

84. 柱状图中最大的矩形

42. 接雨水 是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。 因此与接雨水相反,该题使用单调递增栈。 如下图,在2号柱(value: 5)柱左边第一个更小的柱子是1号柱(value: 1),右边第一个更小的柱子是4号柱(value: 2)。意味着以5为高度能贯穿两个边界这之间的柱子。

 

    int largestRectangleArea(vector<int> &heights)
    {
        stack<int> stk; // 单调递减栈
        int ans{0};
        heights.insert(heights.begin(), 0);  // 数组头部加入元素0
        heights.push_back(0);  // 数组尾部加入元素0
        for (int i = 0; i < heights.size(); ++i)
        {
            while (!stk.empty() && heights[i] < heights[stk.top()])
            {
                int right = i;
                int mid = stk.top();
                stk.pop();

                int left = stk.top();
                int width = right - left - 1;
                int h = heights[mid];
                ans = max(ans, width * h);
            }
            stk.push(i);
        }
        return ans;
    }

 

标签:柱子,吃透,int,top,Hard,stk,柱状图,height,heights
From: https://www.cnblogs.com/spacerunnerZ/p/17674709.html

相关文章

  • BUUCTF [极客大挑战 2019]HardSQL
    判断过滤哪些关键词和字符报错注入报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误和concat+rand()+group_by()导致主键重复xpa......
  • 吃透这份阿里P7大佬整理的《Android Framework源码笔记》,还怕找不到工作?
    前言随着Android开发行业的快速发展,市场需求也在不断提升,导致低端Android开发市场就业大环境不好、行业趋势下滑,使得不少初中级的Android开发开始失业,找不到工作。对于大部分的开发者来说,找不到工作的一大部分原因,是因为AndroidFramework无法做到精通。想要成为真正的高级Androi......
  • echarts 实现在柱状图绘制标注点
    如图:     代码复用参考:letsymbolArray=['triangle','rect','circle','arrow','diamond','emptyRect','emptyTriangle'];letsymbolColors=['pink','blue',&#......
  • 《深入浅出Java虚拟机 — JVM原理与实战》带你攻克技术盲区,夯实底层基础 —— 吃透cla
    前言介绍了解Java代码如何编译成字节码并在JVM上执行是非常重要的。这种理解可以帮助我们理解程序执行时发生的情况,确保语言特性符合逻辑,并在进行讨论时能够全面考虑各种因素和副作用。本文将深入探讨Java代码编译成字节码并在JVM上执行的过程。如果您对JVM的内部结构和字节码执行......
  • [SWPUCTF 2021 新生赛]hardrce
    [SWPUCTF2021新生赛]hardrce题目来源:nssctf题目类型:web涉及考点:rec1.上来直接代码审计<?phpheader("Content-Type:text/html;charset=utf-8");error_reporting(0);highlight_file(__FILE__);if(isset($_GET['wllm'])){$wllm=$_GET['wllm'];......
  • [AGC001E] BBQ Hard 题解
    计数题好题。思路考虑\(\dbinom{n+k}{k}\)的几何意义。即从\((1,1)\)到\((k,n)\)只往上或往右走的方案数。由于这个在几何上坐标可以平移。也就是\((1-x,1-y)\)到\((k-x,n-y)\)的方案与\((1,1)\)到\((k,n)\)的方案数是一样的。那么我们就可以求出所有\((1-a_......
  • Spring Boot集成Sharding JDBC分库分表
    背景近期公司购物车项目需要使用ShardingJDBC分表,特记录下。ps:未分库依赖引入<!--sharding-sphereVersion:4.1.1--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><ver......
  • echarts柱状图数据太多设置滚动条
    转自:https://blog.csdn.net/weixin_42728767/article/details/131303246当你的项目中因数据量太大,导致柱状图数据全部叠在一起不便于看的时候,你们是怎么处理的?大部分同学可能第一想法就是裁剪一部分数据,仅展示页面最大限度能够展示的数据,这确实是一个好办法,简单快速。但有时候怎么......
  • teamcenter awc 这两个柱状图数据比例差别太大,导致进行中的13条数据显示不出来,点击事
    原因: 解决方法:修改参数: ......
  • teamcenter awc 开发-柱状图、饼状图修改颜色
    1、在对应的chartProviders下面添加"chartColorOverrideClass":"hf_aw-charts-chartColor"2、在src下创建一个scss文件@import'mixins/mixins';.hf_aw-charts-chartColor1{   background-color:#426ab3;}.hf_aw-charts-chartColor2{   backgroun......