【问题描述】[困难]

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。输入: [2,1,5,6,2,3]
输出: 10来源:力扣(LeetCode)

【解答思路】

1. 暴力

可以枚举以每个柱形为高度的最大矩形的面积。

具体来说就是:依次遍历柱形的高度,对于每一个高度分别向两边扩散,求出以当前高度为矩形的最大宽度多少。

时间复杂度:O(N^2) 空间复杂度:O(1)

public class Solution {public int largestRectangleArea(int[] heights) {int len = heights.length;// 特判if (len == 0) {return 0;}int res = 0;for (int i = 0; i < len; i++) {// 找左边最后 1 个大于等于 heights[i] 的下标int left = i;int curHeight = heights[i];while (left > 0 && heights[left - 1] >= curHeight) {left--;}// 找右边最后 1 个大于等于 heights[i] 的索引int right = i;while (right < len - 1 && heights[right + 1] >= curHeight) {right++;}int width = right - left + 1;res = Math.max(res, width * curHeight);}return res;}
}
2. 单调栈




时间复杂度:O(N) 空间复杂度:O(N)

import java.util.ArrayDeque;
import java.util.Deque;public class Solution {public int largestRectangleArea(int[] heights) {int len = heights.length;if (len == 0) {return 0;}if (len == 1) {return heights[0];}int area = 0;Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < len; i++) {while (!stack.isEmpty() && heights[stack.peekLast()] > heights[i]){int height = heights[stack.removeLast()];while (!stack.isEmpty() &&  heights[stack.peekLast()] == height){stack.removeLast();}int width;if (stack.isEmpty()){//iwidth = i;} else {width = i - stack.peekLast() - 1;}area = Math.max(area , width * height);}stack.addLast(i);}
//遍历完还没出栈的while (!stack.isEmpty()){int height = heights[stack.removeLast()];while (!stack.isEmpty() &&  heights[stack.peekLast()] == height){stack.removeLast();}int width;if (stack.isEmpty()){width = len;//肯定能到达} else {width = len - stack.peekLast() - 1;}area = Math.max(area , width * height);}return area;}
}
3. 哨兵思想+单调栈


时间复杂度:O(N) 空间复杂度:O(N)

import java.util.ArrayDeque;
import java.util.Deque;public class Solution {public int largestRectangleArea(int[] heights) {int len = heights.length;if (len == 0) {return 0;}if (len == 1) {return heights[0];}int area = 0;int[] newHeights = new int[len + 2];for (int i = 0; i < len; i++) {newHeights[i + 1] = heights[i];}len += 2;heights = newHeights;Deque<Integer> stack = new ArrayDeque<>();stack.addLast(0);for (int i = 1; i < len; i++) {while (heights[stack.peekLast()] > heights[i]) {int height = heights[stack.removeLast()];int width  = i - stack.peekLast() - 1;area = Math.max(area, width * height);}stack.addLast(i);}return area;}
}

【总结】

1.算法思想

其实可以把这个想象成锯木板,如果木板都是递增的那我很开心,如果突然遇到一块木板i矮了一截,那我就先找之前最戳出来的一块(其实就是第i-1块),计算一下这个木板单独的面积,然后把它锯成次高的,这是因为我之后的计算都再也用不着这块木板本身的高度了。再然后如果发觉次高的仍然比现在这个i木板高,那我继续单独计算这个次高木板的面积(应该是第i-1和i-2块),再把它俩锯短。直到发觉不需要锯就比第i块矮了,那我继续开开心心往右找更高的。当然为了避免到了最后一直都是递增的,所以可以在最后加一块高度为0的木板

这个算法的关键点是把那些戳出来的木板早点单独拎出来计算,然后就用不着这个值了。

2.对于 使用 Java 的朋友, Stack 改用 Deque 的问题,参考文章:https://mp.weixin.qq.com/s/Ba8jrULf8NJbENK6WGrVWg
3.单调栈

出栈都要做的判断!stack.isEmpty()

4.哨兵思想

转载链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/bao-li-jie-fa-zhan-by-liweiwei1419/

参考链接:
https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/xiang-jie-dan-diao-zhan-bi-xu-miao-dong-by-sweetie/

[Leedcode][JAVA][第84题][柱状图中最大的矩形][暴力][单调栈]相关推荐

  1. [Leedcode][JAVA][第1014题][最佳观光组合][数组][暴力优化]

    [问题描述][中等] 给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i.一对景点(i < j)组成的观光组合的得分为(A[i] + ...

  2. leetcode 84. Largest Rectangle in Histogram | 84. 柱状图中最大的矩形(单调栈)

    题目 https://leetcode.com/problems/largest-rectangle-in-histogram/ 题解 一句话总结:遍历数组,对于每个height[i],以其自身的高度 ...

  3. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  4. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  5. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  6. LeetCode 84. 柱状图中最大的矩形(单调递增栈)

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

  7. leetcode.84 leetcode739. 每日温度(都是单调栈)

    学习不息,转载不止. 后面有自己写的题解.别忘了. 单调栈学习建议以及练习(15:54 开始):「力扣」第 42.739.496.316.901.402.581 题. 这是一个非常典型的利用单调栈来解 ...

  8. [Leedcode][JAVA][第300题][最长上上子序列][动态规划][压缩空间]

    [问题描述][中等] 给定一个无序的整数数组,找到其中最长上升子序列的长度.示例:输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它 ...

  9. [Leedcode][JAVA][第680题][验证回文字符串Ⅱ][贪心][递归]

    [问题描述][第680题][验证回文字符串Ⅱ][简单] 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串.示例 1:输入: "aba" 输出: True 示例 2 ...

最新文章

  1. 手机与Camera CCM技术发展趋势
  2. Apache Hadoop YARN – ResourceManager--转载
  3. 简单的计算机试题,这么简单的MS Office试题基础,一般人都不好意思看!
  4. NS3入门--first.cc
  5. Windows查找JDK的路径
  6. 浏览器开发重要的参考博客
  7. Codeforces.888G.Xor-MST(Borůvka算法求MST 贪心 Trie)
  8. 2018.09.07阿里巴巴笔试题
  9. Kotlin 能追赶上 Java 的步伐吗?
  10. 中兴6908的三层交换
  11. 扫描枪无限连服务器,无线一维扫描枪配置无线网络使用的方法
  12. everthing 打开历史记录功能
  13. 【华为灰度管理法】之读书思维导图及感想分享
  14. 灵活操作MS SQL 2005 中的数据库 - 分离、附加、离线、在线、日志截断
  15. svg图标如何修改大小?
  16. survival | 生存分析(1):生存曲线(上)
  17. mac为什么又叫linux,为什么我从 Mac 换到了 Linux
  18. 趣图:深度学习之大炮打蚊子
  19. npm查看一个包的版本信息
  20. 聚观早报 | 茅台市值超过腾讯位列第一;三星正研发智能戒指

热门文章

  1. 关于电脑自动获取和静态IP的问题
  2. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
  3. SharePoint要在master page中动态显示List数据的几种方式
  4. java 文本排序_如何使用Java按最高编号对文本文件进行排序
  5. JS判断是否是科学计算结果并处理
  6. 自定义EditText输入框
  7. js 短信验证码 6位数字
  8. 我的世界JAVA刷怪范围_《我的世界》只有刷怪蛋能够刷新生物吗?并不是,还有一种物品!...
  9. java中级做dao模型_DAO-持久层-领域对象-贫血模型
  10. 计算机技术与自动化期刊官网,计算技术与自动化是什么级别