博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Largest Rectangular Area in a Histogram
阅读量:6844 次
发布时间:2019-06-26

本文共 2668 字,大约阅读时间需要 8 分钟。

题目地址: ,刚開始事实上没做这个题,而是在做当中非常重要的一步就是用到Largest Rectangular Area in a Histogram题中的算法。

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 rectangle is shown in the shaded area, which has area = 10 unit.

For example,

Given height = [2,1,5,6,2,3],
return 10.

參考这篇博文思想:

For example, consider the following histogram with 7 bars of heights {6, 2, 5, 4, 5, 2, 6}. The largest possible rectangle possible is 12 (see the below figure, the max area rectangle is highlighted in red)

算法思想:

For every bar ‘x’, we calculate the area with ‘x’ as the smallest bar in the rectangle. If we calculate such area for every bar ‘x’ and find the maximum of all areas, our task is done. How to calculate area with ‘x’ as smallest bar? We need to know index of the first smaller (smaller than ‘x’) bar on left of ‘x’ and index of first smaller bar on right of ‘x’. Let us call these indexes as ‘left index’ and ‘right index’ respectively.

We traverse all bars from left to right, maintain a stack of bars. Every bar is pushed to stack once. A bar is popped from stack when a bar of smaller height is seen. When a bar is popped, we calculate the area with the popped bar as smallest bar. How do we get left and right indexes of the popped bar – the current index tells us the ‘right index’ and index of previous item in stack is the ‘left index’.

算法流程:

1) Create an empty stack.

2) Start from first bar, and do following for every bar ‘hist[i]‘ where ‘i’ varies from 0 to n-1.

……a) If stack is empty or hist[i] is higher than the bar at top of stack, then push ‘i’ to stack.
……b) If this bar is smaller than the top of stack, then keep removing the top of stack while top of the stack is greater. Let the removed bar be hist[tp]. Calculate area of rectangle with hist[tp] as smallest bar. For hist[tp], the ‘left index’ is previous (previous to tp) item in stack and ‘right index’ is ‘i’ (current index).

3) If the stack is not empty, then one by one remove all bars from stack and do step 2.b for every removed bar.

代码java实现

public class Solution {    	public int largestRectangleArea(int[] height) {		int maxarea = 0;		Stack
sta = new Stack<>(); int top ; int top_area; int i = 0; while(i
maxarea){ maxarea = top_area; } } } while(!sta.isEmpty()){ top = sta.pop(); top_area = height[top] * (sta.isEmpty()? i:i-sta.peek()-1); if(top_area>maxarea){ maxarea = top_area; } } return maxarea; }}

时间复杂度:由于每一个元素仅仅push pop一次,时间复杂度O(n).

转载地址:http://dbdul.baihongyu.com/

你可能感兴趣的文章
小型公司局域网故障排查(思科)
查看>>
搭建Mysql数据库
查看>>
构建Squid传统代理及透明代理
查看>>
Ejecta (HTML5 Canvas加速引擎)
查看>>
数据备份与恢复
查看>>
【比原链】比原链合约入门
查看>>
PLSQL Developer连接Oracle11g 64位数据库配置详解
查看>>
什么是最有效的ddos混合防御方法?
查看>>
系统录音软件哪个好用,怎么录制系统声音
查看>>
【JS框架】【Cocos2d-javascript】入门教程三部曲【注:教程已过时】
查看>>
This certificate was signed by an unkown authority
查看>>
Java中常用的锁机制
查看>>
Android开发不得不知;爆款小程序是如何诞生的?
查看>>
史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)
查看>>
二进制格式安装MySQL
查看>>
如何使用VNC Viewer连接远程CentOS服务器
查看>>
持久化上下文
查看>>
Java并发/多线程指南
查看>>
深入理解并行编程1
查看>>
听诺奖评委讲演有感
查看>>