在柱状图中找最大矩形——O(n)时间复杂度java实现
在柱状图中找最大矩形——O(n)时间复杂度java实现
ZZ:http://blog.csdn.net/xybsos/article/details/8049048
具体题目如下:给一组非负的整数来表示一个柱状图,设计一个算法获得柱状图中最大矩形的面积。比如,输入如下数据:2,1,4,5,1,3,3 ,其中每个数表示一个柱状条的高度,柱状条的宽度为默认值1,则计算得最大矩形的面积为8。
思路:使用一个栈来保存输入柱状条,每个柱状条包含两个信息:(1)柱状条的高度(height);(2)柱状条的x坐标(index) 。数组中的柱状条按序准备入栈,入栈的条件:当入栈元素e的高度>=栈顶元素的高度时,元素e入栈;否则,将栈顶元素出栈,同时更新最大矩形maxValue的值。
更新maxValue的算法如下:
1. 计算以当前栈顶元素的高度为宽度的矩形的面积:tmpValue = topElement.height * (e.index - topElement.index);
2. 更新maxValue: maxValue = (maxValue > tmpValue) ? maxValue : tmpValue;
所有元素入栈完毕,将栈中剩余的元素依次出栈,同时按照相同的思路更新maxValue的值。
java实现:
import java.util.ArrayList; import java.util.List; import java.util.Stack;public class MaxRectangle {// 使用栈来保存每个柱状条,当当前准备入栈的柱状条的高度小于当前栈顶的柱状条高度时,先让栈顶元素出栈,同时计算最大的矩形大小public int maxRectangleValue(int[] array) {if (array == null || array.length <= 0)return -1;int maxValue = 0;List<Element> inputList = new ArrayList<Element>();int len = array.length;for (int i = 0; i < len; i++) {Element element = new Element(array[i], i);inputList.add(element);}// 开始入栈操作Stack<Element> stack = new Stack<Element>();for (Element e : inputList) {if (stack.empty())stack.add(e);else {while (e.height < stack.peek().height) { // 出栈,并计算最大矩形大小Element topElement = stack.pop();int tmpValue = topElement.height * (e.index - topElement.index); // height * widthif (tmpValue > maxValue)maxValue = tmpValue;if (stack.empty())break;}// 进栈 stack.add(e);}}// 将堆栈中包含的所有元素出栈,同时更新最大的矩形大小while (!stack.empty()) {Element topElement = stack.pop();int tmpValue = topElement.height * ((len - 1) - topElement.index + 1); // height * widthif (tmpValue > maxValue)maxValue = tmpValue;}return maxValue;}public static void main(String[] args) {int[] array = {2,1,4,5,1,3,3};MaxRectangle mr = new MaxRectangle();System.out.println(mr.maxRectangleValue(array));} }class Element {public int height; // 每一个柱状条的高度(宽度为1)public int index; // 每个柱状条的x坐标值,代表它们出现的相对次序public Element(int height, int index) {this.height = height;this.index = index;} }
算法分析:
所有数组元素需要一次进栈和一次出栈,所以总的时间复杂度为:O(n)
转载于:https://www.cnblogs.com/lightBase/archive/2012/10/18/2729019.html
在柱状图中找最大矩形——O(n)时间复杂度java实现相关推荐
- 【LeetCode】【HOT】84. 柱状图中最大的矩形(栈)
[LeetCode][HOT]84. 柱状图中最大的矩形 文章目录 [LeetCode][HOT]84. 柱状图中最大的矩形 package hot;import java.util.ArrayDeq ...
- 柱状图中最大的矩形多种解法
一.前言 问题来源LeetCode 84,难度:困难 问题链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 二.题 ...
- java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形
84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的 ...
- LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)
柱状图中最大的矩形(暴力法,单调栈) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 暴力法 3.2 单调栈 4. Java实现 1. 题目描述 难度:困难 2. 题目分析 这道题有两种解法 ...
- 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形
84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...
- leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、
lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...
- LeetCode 84.柱状图中最大的矩形
今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一下备忘录是 ...
- 84. 柱状图中最大的矩形
84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 示例 1: 输入:heights ...
- 用python 求矩形最大面积_LeetCode 84. 柱状图中最大的矩形 | Python
84. 柱状图中最大的矩形 题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个 ...
最新文章
- 水冷超算平台落地北大,联想赋能行业智能化变革
- 预发布环境,Tag发布机制和可重复的部署过程
- 关于vmware workstation10常见问题
- Android把自己应用加入到系统文件分享中
- C语言文件与数组之间输入输出操作
- php按时间归档,PHP文章按日期(月日)SQL归档
- PHP exit函数介绍
- 一分钟理解handler机制
- 利用MO实现流场显示
- Ubuntu安装gcc 以及g++
- 2021年高压电工模拟考试系统及高压电工考试试题
- c语言借阅管理题目内容描述,C语言-图书借阅管理系统
- 20162327WJH使用队列:模拟票务站台代码分析
- 01-oracle账号的注册
- NVP6124I北京冠宇铭通 芯片
- linux下使用磁带备份
- Linux如何才能ping通外网(详细设置过程,基于Qracle VM VirtualBox)
- 全球最大 IPO,我们能否赚笔养老钱?
- 5分钟带你啃完营销著作《市场营销原理(科特勒)》,思维导图精华版
- 比较了几种编程语言后,我终于get到了少儿编程的真谛
热门文章
- Flutter底部导航栏BottomNavigationBar页面状态保持解决方案
- Mr.J--Vue之v-for全解析
- POCO C++库导游【转】
- C# Tostring 格式化输出字符串全解
- Arcgis License的安装及破解
- ansible基本模块-shell
- python 函数内部声明全局变量
- Docker+Nextcloud快速部署个人网盘
- Consider defining a bean named 'entityManagerFactory' in your configuration解决办法
- SSIS hang with unhandle exception