LeetCode84:柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

首先定义:

  对柱形图中的一个矩形i来说,我们计算以heights[i]为高的矩形的最大面积时,以i为起点,向左找到第一个小于heights[i]的矩形j,向右找到第一个小于heights[i]的矩形k。(j,k)区间,也即[j+1,k-1]所围成的以heights[i]的矩形就是i的最大矩形。当然,这个矩形面积不一定是整个柱形图中的最大矩形,但一定是i的最大矩形,因为i是[j+1,k-1]区间内最短的一个,如果这个区间内有某个矩形z的高heights[z]小于heights[i],则区间所围成的矩形最大面积应该以heights[z]为高,因为z才是真正的短板。

  因此,如果我们要计算整个柱形图中的最大面积,其实只要找到所有的以i(i=0....n-1)的高为高的最大矩形,在里面选一个就好了。

  实际操作上可以对每个矩形都向左找一个上界,向右找一个下界,但这样时间复杂度实际上是处于O(n^2)。

  因此可以考虑用一个单调递增的栈,栈中存储的是矩形的索引。

首先为什么要选取一个单调递增栈呢?因为如果采取单调递增栈,则对栈中任意一个元素i来说,i以前入栈的元素一定都比它矮,也就是说我们不用去寻找上界,它的上界一定就是第i-1个元素。

然后为什么要存储矩形的索引呢?因为根据索引我们既可以马上得到它的高heights[i],也可以马上得到它的宽,只要用索引加减就可以了。

计算流程:

1).最开始入栈-1(-1的作用是当栈中只有一个矩形时,它的上界就是-1,不然栈中只有这一个矩形的话上界不方便计算)。

2).如果当前矩形i的高>=heights[aux.top()],则入栈。这是为了保持栈的单调递增性质。

3).如果当前矩形i的高<heights[aux.top()],则将aux.top()出栈,对出栈的这个元素j来说,他在栈中的前一个元素a一定是小于它的,所以一定是它的上界。现在的这个元素i的高也一定是小于它的,所以是它的下界,因此以aux.top()为高的最大矩形的上下界就已经确定下来为(a,i),也就是[a+1,i-1]了,对这个矩形j来说,它的最大面积为heights[j]*(i-1-(a+1)+1)。计算得到这个面积area后,将他与max作对比并做记录。继续与现在的aux.top()和i做对比,出栈直到heights[aux.top()]<heights[i]时,在将i入栈。

4)循环这个过程。当然,如果说矩形的最后几个元素高都是递增的,最后会发现栈中除-1外还有元素,因此在最开始我们就在heights中加入一个0,这个0的作用就是用于最后对付栈未空的情况,因为0一定可以作为矩形们的下界。

代码:

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
		if(heights.size()==0)
			return 0;
		stack<int> aux;
		int max=INT_MIN;
		aux.push(-1);
		heights.push_back(0);
		for(int i=0;i<heights.size();i++)
		{
			if(aux.top()==-1||heights[aux.top()]<=heights[i])
				aux.push(i);
			else
			{
				while(aux.top()!=-1&&heights[aux.top()]>heights[i])
				{
					int h=heights[aux.top()];
					aux.pop();
					int area=h*(i-aux.top()-1);
					if(area>=max)
						max=area;
				}
				aux.push(i);
			}
		}
		if(max<=0)
			return 0;
		return max;
    }
};

  

原文地址:https://www.cnblogs.com/lxy-xf/p/11287822.html

时间: 2024-08-28 22:20:08

LeetCode84:柱状图中最大的矩形的相关文章

Leetcode84. 柱状图中最大的矩形(单调栈)

84. 柱状图中最大的矩形 前置 单调栈 做法 连续区间组成的矩形,是看最短的那一块,求出每一块左边第一个小于其高度的位置,右边也同理,此块作为最短限制.需要两次单调栈 单调栈维护递增区间,每次不满足弹出栈顶,顺便利用此栈顶和当前位置计算栈顶能覆盖的长度 用来计算.仅需一次单调栈 原文地址:https://www.cnblogs.com/y2823774827y/p/11261446.html

[LeetCode] 84. 柱状图中最大的矩形

题目链接 : https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 题目描述: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]. 图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位. 示例: 输入: [2,1,5,6,2,3] 输出:

【leetcode】柱状图中最大的矩形(第二遍)

题目链接 [题解] 考虑每个柱子为最高柱子对答案的贡献,就是看这个柱子往左能domain多少个单位 往右能domain多少个单位. 遇到比它小的为止 遍历所有的柱子为最高柱子的情况. 就能够覆盖到所有的矩形了. 也即枚举一个位置然后如果比它高就一直扩展,往左往右各做一次就好. 这样的时间复杂度是O(N^2)的 我们可以维护一个单调递增的队列. 这个队列里面第i个元素和第i-1个元素 假设他们原来在数组里的位置是 ii和jj 显然min(ii+1,jj)..jj这一段里面的柱子都是比i元素也即在原

84. Largest Rectangle in Histogram *HARD* -- 求柱状图中的最大矩形面积

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The largest

[leetcode] 85. 最大矩形

85. 最大矩形 解法1: 一个思路就是这个可以看作84. 柱状图中最大的矩形的扩展,这道题的二维矩阵每一层向上都可以看做一个直方图,输入矩阵有多少行,就可以形成多少个直方图,对每个直方图都调用 84. 柱状图中最大的矩形 中的方法,就可以得到最大的矩形面积. class Solution { public int maximalRectangle(char[][] matrix) { int m = matrix.length; if (m == 0) return 0; int n = ma

2014年秋季大学先修课考试 解题报告

A:细菌的战争 总时间限制:  1000ms 内存限制:  65536kB 描述 有两种细菌,一种是有害菌,繁殖能力很强,每小时会繁殖一倍:另一种是有益菌,繁殖能力较弱,每小时能繁殖百分之五.但在单位体积内,当有害菌数量超过一 百万时,多出的细菌会因为密度太大而迅速死亡,直到细菌数量下降到一百万.已知每个有益菌每小时能消灭一个有害菌.给定单位体积内有害菌和有益菌的初始数 量,请问多少小时后,有害菌将被有益菌消灭干净? 输入 输入的第一行为一个整数n,表示后边有n组数据.每组数据占一行,有两个整数

LeetCode: Largest Rectangle in Histogram [084]

[题目] Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. The lar

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

相邻最大矩形面积的问题

9715 相邻最大矩形面积 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC;JAVA Description 在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个 矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同. 例如下图,图1包含的矩形的高分别为2,1,4,5,1,3,3 单位长度,矩形的宽为1单位长度. 你的任务就是计算柱状图中以X轴为底边的最大矩形的面积.