首页 > 其他分享 >单调栈

单调栈

时间:2022-12-04 17:57:05浏览次数:30  
标签:int 元素 new 矩形 stack 单调

单调栈

单调栈简单来说是在栈的先进后出基础之上额外添加一个特性:从栈顶到栈底的元素是严格递增(or递减)
具体进栈过程如下:
对于单调递增栈,若当前进栈元素为 e,从栈顶开始遍历元素,把小于 e 或者等于 e 的元素弹出栈,直接遇到一个大于 e 的元素或者栈为空为止,然后再把 e 压入栈中。
对于单调递减栈,则每次弹出的是大于 e 或者等于 e 的元素。

举个例子,将[3,4,2,6,4,5,2,3] 从左至右入栈,按单调递增栈形式进行入栈,即要插入栈顶的元素e入栈前必须比之前栈顶的元素小或相等(这样才符合从栈顶到栈底的元素时严格递增的),否则就不停地弹出栈顶元素,直到满足条件为止。换句话说,也就是必须要遇到大于插入栈顶元素e的元素或者栈为空时,e才入栈。

可以对于单调递增栈而言,发现每次进栈操作后,栈顶元素e左边元素都是原数组中该元素e左边第一个大于它的数。


单调栈例题:

问题描述:

在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。


请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。

输入格式

第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。

输出格式

输出一行,包含一个整数,即给定直方图内的最大矩形的面积。

样例输入

6
3 1 6 5 2 3

样例输出

10

import java.util.LinkedList;
import java.util.Scanner;

public class Main3 extends Thread {

	public static void main(String[] args) {
		new Main3().run();
	}

	@Override
	public void run() {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] h = new int[n + 1];
		for (int i = 0; i < n; i++) {
			h[i] = scanner.nextInt();
		}
		h[n] = -1;
		scanner.close();

		int maxArea = 0;
		LinkedList<Integer> stack = new LinkedList<>();
		for (int i = 0; i < n + 1; i++) {
			while (!stack.isEmpty() && h[i] < h[stack.peek()]) {
				int maxH = h[stack.peek()];
				stack.pop();
				int left = stack.isEmpty() ? -1 : stack.peek();
				int maxW = i - (left + 1);
				maxArea = Math.max(maxArea, maxW * maxH);
			}
			stack.push(i);
			System.out.println(stack);
		}
		System.out.println(maxArea);
	}
}

标签:int,元素,new,矩形,stack,单调
From: https://www.cnblogs.com/kingmc/p/16950289.html

相关文章

  • 单调队列学习笔记
    用处:滑动窗口维护区间最值核心思想:双端队列,队首放最大值/最小值的下标,1.清除不是更优的(队尾弹出)。2.清除过期的(队首弹出)。例题:https://www.luogu.com.cn/problem/P3088......
  • 算法刷题入门线性表|单调栈
     一、概念1、栈的定义栈 是仅限在 一端 进行 插入 和 删除 的 线性表。 栈 又被称为后进先出(LastInFirstOut)的线性表,简称LIFO。2、栈顶栈 是一......
  • 单调栈
    给定一个长度为n 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。#include<iostream>#include<stack>usingnamespacestd;intn;stack<int>......
  • 《浅谈决策单调性动态规划的线性解法》阅读随笔
    读下来唯二的感想这就是集训队吗真nb这就是集训队吗写的什么jb这latex就很离谱好吧一个变量改好几次名字我都不知道他在干什么啊对了没实现代码啊都是找的st......
  • 单调栈和单调队列
    P5788【模板】单调栈入栈时候判定,如果不符合栈内的规则,则让栈顶的元素出栈。voidsolve(){stack<int>sc;ufr(i,1,n){if(sc.empty()){sc.emp......
  • 决策单调性优化dp二则
    CielandGondolas  CodeForces-321E题意:有n个人,第i个人和第j个人放在一起时会产生a[i][j]的沮丧值(是社恐吗),保证a[i][j]=a[j][i],两个人只产生一份沮丧值。将n个人分成......
  • 738.单调递增的数字 monotone-increasing-digits
    问题描述738.单调递增的数字解题思路将该数字的每一位数字变成数组dec<int>的一部分,然后依次遍历,直到dec[i]>dec[i+1],然后将dec[i+1]及以后的数字都变成9,如果dec[......
  • 单调栈
    title:单调栈date:2022-11-1720:33:16tags:算法本文章遵守知识共享协议CC-BY-NC-SA,转载时需要署名,推荐在我的个人博客阅读。单调栈是一种可以在线性时间中计算......
  • 单调队列优化DP
    先存这里理解了再继续编写CF1077F2PictureswithKittens(hardversion)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllN=5e3+10......
  • 垃圾收集器使用场景和ZGC的简单调优
    本文背景在对于去哪儿网的《ZGC在去哪儿机票运价系统实践》的这篇文章阅读之后,对于parNew+cms这对垃圾收集的组合和g1以及zgc这几种垃圾收集器有了更加深入的了解,特此形......