Largest Rectangle in Histogram

本文介绍了一种高效算法,用于找出直方图中最大矩形的面积。通过使用栈来跟踪直方图中的柱状高度,该算法能够在O(n)的时间复杂度内解决问题。文章还提供了详细的代码示例。

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.

思路:

一个比较直观的思路是对于每个直方,分别向左右找到比它小的直方,然后求得从当前位置扩展可得到的最大值。然而这需要O(n^2)的复杂度,其中有很多重复的判断。

可以使用一个栈来实现上述思路。当栈为空或者栈顶元素小于当前值时,把当前值压入栈中,否则的话相当于找到了右边界,再从栈中弹出元素,因为栈内元素是递增的,所以弹出来的相当于是左边界。逐个计算面积,更新当前的max值,直到栈顶元素大于当前元素为止。弹栈时需要注意栈为空的情况。

代码:

 1     int max(int a, int b){
 2         if(a > b)
 3             return a;
 4         return b;
 5     }
 6     int largestRectangleArea(vector<int> &height) {
 7         // IMPORTANT: Please reset any member data you declared, as
 8         // the same Solution instance will be reused for each test case.
 9         stack<int> Stack;
10         int size = height.size();
11         if(size == 0)
12             return 0;
13         int i = 0;
14         int maxRec = 0;
15         while(i < size){
16             if(Stack.empty() || height[Stack.top()] <= height[i]){
17                 Stack.push(i++);
18             }
19             else{
20                 int t = Stack.top();
21                 Stack.pop();
22                 int tmpRec = height[t]*(Stack.empty()?i:i-Stack.top()-1);
23                 if(tmpRec > maxRec)
24                     maxRec = tmpRec;
25             }
26         }
27         while(!Stack.empty()){
28             int t = Stack.top();
29             Stack.pop();
30             int tmpRec = height[t]*(Stack.empty()?i:i-Stack.top()-1);
31             if(tmpRec > maxRec)
32                 maxRec = tmpRec;
33         }
34         return maxRec;
35     }

 

转载于:https://www.cnblogs.com/waruzhi/p/3439218.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值