直方图内最大矩形
来源:互联网 发布:无法连接windows系统 编辑:程序博客网 时间:2024/06/04 18:51
问题描述:
有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。
给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
测试样例:
[2,7,9,4,1],5
返回:14
分析:这里我们维护一个堆栈,当栈顶中的元素大于当前元素时,那么可能包含栈顶元素的(最后结果)的高度实际上是由当前元素限制死了。所以弹栈。当然了,在弹栈过程中,还需要计算弹出栈的面积。因为栈中维护的是一个递增的元素,所以弹栈之后,再弹栈时,右边界实际上变成了最开始弹栈的右边界。
代码如下:
import java.util.*;public class MaxInnerRec { class Node{ int left; int right; int val; Node(int left,int right,int val){ this.left = left; this.right = right; this.val = val; } } public int countArea(int[] A, int n) { // write code here if(n<=0) return 0; int max = 0; Stack<Node> stack = new Stack<>(); stack.push(new Node(0,1,A[0])); for(int i = 1;i<n;i++){ Node top = stack.peek(); int rightEdge = -1; int leftEdge = i; while(top.val>A[i]){//弹出节点 stack.pop(); if(rightEdge == -1) rightEdge = top.right; leftEdge = top.left; int area = (rightEdge-leftEdge)*top.val; if(area>max) max = area; if(stack.isEmpty()) break; top = stack.peek(); } stack.push(new Node(leftEdge,i+1,A[i])); } int rightEdge = -1; while(!stack.isEmpty()){ Node top = stack.pop(); if(rightEdge == -1) rightEdge = top.right; int area = (rightEdge-top.left)*top.val; if(area>max) max = area; } return max; }}
0 0
- 直方图内最大矩形
- 直方图内最大矩形
- 直方图内最大矩形
- 直方图内最大矩形
- 直方图内最大矩形
- 直方图内最大矩形
- 直方图内最大矩形
- (牛客)直方图内最大矩形
- 直方图内最大矩形问题
- 美团 直方图内最大矩形
- 华为机试---直方图内最大矩形
- lintcode[122]:直方图内最大矩形面积
- 美团-直方图内最大矩形-Java
- 【美团】直方图内最大矩形
- 动态规划-直方图内最大矩形
- 牛客网---2016---美团直方图内最大矩形
- 直方图内矩形面积
- 直方图最大面积矩形
- Servlet基础
- java jvm虚拟机的参数
- 分享一个好用的日期类型跟long转换工具
- Android:仿微信开场切换界面
- iOS Xcode多行注释@param—VVDocumenter
- 直方图内最大矩形
- Apple Watch——Glance介绍与生命周期
- Android新特性之CardView的简单使用
- 两台设备中同步Hexo博客
- 黑马程序员—Java基础(二)
- 马尔科夫模型
- Duplicate Emails
- vector及各种容器详解
- Android系统自带样式(@android:style/)