在柱状图中找最大矩形——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实现相关推荐

  1. 【LeetCode】【HOT】84. 柱状图中最大的矩形(栈)

    [LeetCode][HOT]84. 柱状图中最大的矩形 文章目录 [LeetCode][HOT]84. 柱状图中最大的矩形 package hot;import java.util.ArrayDeq ...

  2. 柱状图中最大的矩形多种解法

    一.前言 问题来源LeetCode 84,难度:困难 问题链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ 二.题 ...

  3. java 柱状图 宽度_Java实现 LeetCode 84 柱状图中最大得矩形

    84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的 ...

  4. LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)

    柱状图中最大的矩形(暴力法,单调栈) 1. 题目描述 2. 题目分析 3. C语言实现 3.1 暴力法 3.2 单调栈 4. Java实现 1. 题目描述 难度:困难 2. 题目分析 这道题有两种解法 ...

  5. 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形

    84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...

  6. leetcode必刷题(四)lee75 颜色分类、lee76 最小覆盖字串、lee78 子集、lee79 单词搜索、lee84 柱状图中最大的矩形、lee85 最大矩形、lee96 不同的二叉搜索树、

    lee75 颜色分类 patition 三个指针 lee76 最小覆盖字串 滑动窗口 lee78 子集 无重复数字 回溯 lee79 单词搜索 回溯 lee84 柱状图中最大的矩形 单调栈 lee85 ...

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

    今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算 这道题的话三种方法都写了,双指针会超时,优化一下备忘录是 ...

  8. 84. 柱状图中最大的矩形

    84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 示例 1: 输入:heights ...

  9. 用python 求矩形最大面积_LeetCode 84. 柱状图中最大的矩形 | Python

    84. 柱状图中最大的矩形 题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个 ...

最新文章

  1. 水冷超算平台落地北大,联想赋能行业智能化变革
  2. 预发布环境,Tag发布机制和可重复的部署过程
  3. 关于vmware workstation10常见问题
  4. Android把自己应用加入到系统文件分享中
  5. C语言文件与数组之间输入输出操作
  6. php按时间归档,PHP文章按日期(月日)SQL归档
  7. PHP exit函数介绍
  8. 一分钟理解handler机制
  9. 利用MO实现流场显示
  10. Ubuntu安装gcc 以及g++
  11. 2021年高压电工模拟考试系统及高压电工考试试题
  12. c语言借阅管理题目内容描述,C语言-图书借阅管理系统
  13. 20162327WJH使用队列:模拟票务站台代码分析
  14. 01-oracle账号的注册
  15. NVP6124I北京冠宇铭通 芯片
  16. linux下使用磁带备份
  17. Linux如何才能ping通外网(详细设置过程,基于Qracle VM VirtualBox)
  18. 全球最大 IPO,我们能否赚笔养老钱?
  19. 5分钟带你啃完营销著作《市场营销原理(科特勒)》,思维导图精华版
  20. 比较了几种编程语言后,我终于get到了少儿编程的真谛

热门文章

  1. Flutter底部导航栏BottomNavigationBar页面状态保持解决方案
  2. Mr.J--Vue之v-for全解析
  3. POCO C++库导游【转】
  4. C# Tostring 格式化输出字符串全解
  5. Arcgis License的安装及破解
  6. ansible基本模块-shell
  7. python 函数内部声明全局变量
  8. Docker+Nextcloud快速部署个人网盘
  9. Consider defining a bean named 'entityManagerFactory' in your configuration解决办法
  10. SSIS hang with unhandle exception