首页 > 其他分享 >1.4 单调栈

1.4 单调栈

时间:2023-02-08 19:33:05浏览次数:47  
标签:1.4 int lo bn heights width ans 单调

84.柱状图中最大的矩形


最大矩形的高度瓶颈可能在于各个柱子的高度,如图所示

image

基于以上观察,一个朴素算法是:

  1. 枚举每种可能的高度瓶颈
    1.1 向左、右扩展宽度
    1.2 擂台更新最大面积
class Solution {
    public int largestRectangleArea(int[] heights) {
        // 记录绘制矩形的最大面积
        int boss = 0;
        // 枚举高度瓶颈
        for (int bn = 0; bn < heights.length; bn++) {
            // 探寻左右边界
            int lo = bn;
            int hi = bn;
            while (lo - 1 >= 0 && heights[lo - 1] >= heights[bn]) lo--;
            while (hi + 1 < heights.length && heights[hi + 1] >= heights[bn]) hi++;
            boss = Math.max(boss, (hi - lo + 1) * heights[bn]);
        }
        return boss;
    }
}

Smart mathematicians are not ashamed to think small. ———《具体数学》

为了加深对问题的理解,不妨从简单例子入手。不难发现:

  • 若柱子高度单调递增,时间复杂度为\(O(n)\)
    • 从右至左累计宽度,当前面积 = 累计宽度 \(\times\) 当前高度
    • 擂台法更新最大矩形面积
  • 若扫描至某处,单调性被破坏:
    • 不可扩展时,沿用历史记录即可,无需特别考虑
    • 可扩展时,情况可以等效于“柱子高度单调递增”

image

import java.util.ArrayDeque;
import java.util.Deque;

class Solution {
    public int largestRectangleArea(int[] heights) {
        Deque<Rect> s = new ArrayDeque<>();
        int ans = 0;
        for (int h : heights) {
            int width = 0;
            // 单调性破坏
            while (!s.isEmpty() && s.peek().h >= h) {
                width += s.peek().w;
                ans = Math.max(ans, width * s.peek().h);
                s.pop();
            }

            s.push(new Rect(width + 1, h));
        }

        int width = 0;
        while (!s.isEmpty()) {
            width += s.peek().w;
            ans = Math.max(ans, width * s.peek().h);
            s.pop();
        }

        return ans;
    }

    class Rect {
        int h;
        int w;

        Rect(int w, int h) {
            this.h = h;
            this.w = w;
        }
    }
}

标签:1.4,int,lo,bn,heights,width,ans,单调
From: https://www.cnblogs.com/anrushan/p/mono-stack.html

相关文章

  • 【tyvj1305】最大子序和(单调队列)
    problem给你一个长为n的序列求一个长不超过m的连续子段,使子段和最大solution如果n<=10^3,我们很容易写出枚举(s是前缀和,区间[l,r]的和就是s[r]-s[l-1]。枚举l,r即可。for(int......
  • 11.4外围设备的中断请求
    IRQ是用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。该机制称为中断处理。中断处理在硬件控制中担当着重要角色。因为如果没有中断处理,就有可能出现处理无法......
  • 11.4外围设备的中断请求
    让我们再来看一下图11-4。在“I/O范围”下面有一个“IRQ”项目,对应的值是0x00000006(06)。IRQ(IterruptRequest)是中断请求的意思。那么,IQ主要是用来做什么的呢?I......
  • 重学单调队列优化dp
    再谈单调队列优化dp。题目:CF1077F1&2PictureswithKittens(Easy&hardversion)从n个数中选出m个数,连续k个数至少选出一个,最大化选出数和。easyversion普通dp,hard则......
  • django1.4设置模板路径和CSS,JS,image等路径的方法
    对于DJANGO这类MVC框架来说,路径问题可以称为一个谜一样的东西,很多人因为对路径不知道如何处理而觉得MVC实在是云里雾里不知所云。本文主要解决django中关于模板路径设置、CS......
  • 2019南昌网络赛 I. Max answer(DP或者单调栈+思维)
    Alicehasamagicarray.Shesuggeststhatthevalueofaintervalisequaltothesumofthevaluesintheinterval,multipliedbythesmallestvalueinthein......
  • 1.4条件分支和循环机制
    程序的流程分为顺序执行、条件分支和循环三种。顺序执行是按照地址内容的顺序执行指令(每执行一个指令程序计数器的值就自动加1)。条件分支是指根据条件执行任意地址的指令......
  • 1.4 Dart语言简介
    1.4Dart语言简介在之前我们已经介绍过Dart语言的相关特性,读者可以翻看一下,如果读者已经熟悉Dart语法,可以跳过本节,如果你还不了解Dart,也不用担心,按照笔者经验,如果你......
  • 单调栈
    顾名思义单调栈就是具有单调性的栈常见模型:找出每个数左边离它最近的比它大/小的数【算法】intstk[N],tt=0; //栈中存数据for(inti=1;i<=n;i++){i......
  • 单调栈及其应用
    目录单调栈简介伪代码应用应用1:Leetcode.496题目分析代码实现复杂度分析应用2:Leetcode.503题目分析代码实现应用4:Leetcode.2454题目分析代码实现应用4:Leetcode.739题目分析......