当前位置: 首页 > news >正文

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

84. 柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]

输出:10

解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]

输出: 4

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4

解法思路(参考官方题解及视频讲解):

1、暴力1 O(n^3)

for i -> 0, nfor j -> i, n(i, j) -> 最小高度,areaupdate max-area

2、暴力2 O(n^2)

for i -> 0, n:找到 left bound, right boundarea = height[i] * (right - left)update max-area

3、Stack

4、优化 Stack,加哨兵元素

 法一(超时):

class Solution {public int largestRectangleArea(int[] heights) {// Time: O(n^3)// Space: O(1)int maxArea = 0;for (int i = 0; i < heights.length; i++) {for (int j = i; j < heights.length; j++) {int minHeight = Integer.MAX_VALUE;for (int k = i; k <= j; k++) {minHeight = Math.min(minHeight, heights[k]);}maxArea = Math.max(maxArea, minHeight * (j - i + 1));}}return maxArea;}
}

法二(超时):

class Solution {public int largestRectangleArea(int[] heights) {// Time: O(n^2)// Space: O(1)int maxArea = 0;for (int i = 0; i < heights.length; i++) {int minHeight = Integer.MAX_VALUE;for (int j = i; j < heights.length; j++) {minHeight = Math.min(minHeight, heights[j]);maxArea = Math.max(maxArea, minHeight * (j - i + 1));}}return maxArea;}
}

法三:

class Solution {public int largestRectangleArea(int[] heights) {// Stack 空间换时间// 特殊情况1:遍历完成后,栈内元素出栈时一定可以扩展到数组的末尾// 特殊情况2:弹出栈顶后栈为空,一定可以扩散到数组最左边// 特殊情况3:栈中存在高度相等的元素,出栈// Time: O(n)// Space: O(n)int len = heights.length;if (len == 0) return 0;if (len == 1) return heights[0];int maxArea = 0;Deque<Integer> stack = new ArrayDeque<>();for (int i = 0; i < len; i++) {// 当前元素的高度严格小于栈顶元素的高度时,出栈while (!stack.isEmpty() && heights[i] < heights[stack.peekLast()]) {int height = heights[stack.removeLast()];// 特殊情况3:栈中存在高度相等的元素,出栈while (!stack.isEmpty() && heights[stack.peekLast()] == height) {stack.removeLast();}// 特殊情况2:弹出栈顶后栈为空,一定可以扩散到数组最左边int width = stack.isEmpty() ? i : (i - stack.peekLast() - 1);maxArea = Math.max(maxArea, width * height);}stack.addLast(i);}// 弹出栈中所有元素while (!stack.isEmpty()) {int height = heights[stack.removeLast()];while (!stack.isEmpty() && heights[stack.peekLast()] == height) {stack.removeLast();}// 特殊情况1:遍历完成后,栈内元素出栈时一定可以扩展到数组的末尾int width = stack.isEmpty() ? len : (len - stack.peekLast() - 1);maxArea = Math.max(maxArea, width * height);}return maxArea;}
}

优化法三:

class Solution {public int largestRectangleArea(int[] heights) {// Stack(add Sentinel)// Time: O(N)// Space: O(N)int len = heights.length;if (len == 0) return 0;if (len == 1) return heights[0];int maxArea = 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<Integer>();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;maxArea = Math.max(maxArea, width * height);}stack.addLast(i);}return maxArea;}
}

 

相关文章:

  • flutter获取本地图片高度、宽度
  • 如何通过Arthas热更新正在运行中的java代码
  • go语言`json:“-“`标签的含义
  • Vue3-34-路由-路由配置参数 props
  • vue对日期的年、月、日进行增加,转换成指定格式的字符串(yyyy-MM-dd)
  • 2023年“中银杯”安徽省网络安全B模块(部分解析)
  • vivado 指定相对位置
  • 每天五分钟计算机视觉:揭秘迁移学习
  • 原生JS做别踩白块游戏
  • 算法系统学习(持续更新)
  • 栈实现后缀表达式的计算
  • 交换机02_共享式交换式
  • 了解并使用django-rest-framework-jwt
  • 简述Redis备份策略以及对应的实现机制
  • CMake入门教程【基础篇】HelloCMake
  • 【Leetcode】101. 对称二叉树
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Brief introduction of how to 'Call, Apply and Bind'
  • css的样式优先级
  • docker python 配置
  • export和import的用法总结
  • GraphQL学习过程应该是这样的
  • JavaScript实现分页效果
  • java多线程
  • Linux Process Manage
  • React 快速上手 - 07 前端路由 react-router
  • SpiderData 2019年2月23日 DApp数据排行榜
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • windows下mongoDB的环境配置
  • 工程优化暨babel升级小记
  • 基于组件的设计工作流与界面抽象
  • 理解在java “”i=i++;”所发生的事情
  • 目录与文件属性:编写ls
  • 前端攻城师
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 树莓派 - 使用须知
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 优化 Vue 项目编译文件大小
  • 昨天1024程序员节,我故意写了个死循环~
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (利用IDEA+Maven)定制属于自己的jar包
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)甲方乙方——赵民谈找工作
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET Reactor简单使用教程
  • .net 生成二级域名
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况