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

代码随想录算法训练营day60|84.柱状图中最大的矩形 |完结撒花~

84.柱状图中最大的矩形

力扣题目链接

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

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

img

img

  • 1 <= heights.length <=10^5

  • 0 <= heights[i] <= 10^4

  • 暴力解法

class Solution {public int largestRectangleArea(int[] heights) {int res=0;for(int i=0;i<heights.length;i++){int left=i;int right=i;for(;left>=0;left--){if(heights[left]<heights[i]) break;}for(;right<heights.length;right++){if(heights[right]<heights[i]) break;}int w=right-left-1;int h=heights[i];res=Math.max(res,w*h);}return res;}
}
  • 单调栈解法

求左右两边小的, 用单调递减栈

主要就是分析清楚如下三种情况:

  • 情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况
  • 情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况
  • 情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况

头尾要加0 ,如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了,那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。如图:

img

那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。

开头为什么要加元素0?

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。

(mid、left,right 都是对应版本一里的逻辑)

因为 将 8 弹出之后,栈里没有元素了,那么为了避免空栈取值,直接跳过了计算结果的逻辑。

之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。 如图所示:

img

所以我们需要在 height数组前后各加一个元素0。

整体代码如下:

class Solution {public int largestRectangleArea(int[] heights) {int res=0;int[] newheights=new int[heights.length+2];System.arraycopy(heights,0,newheights,1,heights.length);newheights[0]=0;newheights[heights.length+1]=0;Deque<Integer> stack=new LinkedList<>();stack.push(0);for(int i=1;i<newheights.length;i++){while(!stack.isEmpty()&&newheights[i]<newheights[stack.peek()]){int mid=stack.peek();stack.pop();int w=i-stack.peek()-1;int h=newheights[mid];res=Math.max(res,w*h);}stack.push(i);}return res;}
}
http://www.lryc.cn/news/173627.html

相关文章:

  • 在 android 上使用 adb client
  • 竞赛选题 基于深度学习的视频多目标跟踪实现
  • 分布式应用之监控平台zabbix的认识与搭建
  • C语言大佬的必杀技---宏的高级用法
  • @Retryable和Guava retry
  • conda的安装和使用
  • K8S:pod集群调度及相关操作
  • 阿里云便宜服务器2核2G配置经济型e实例一年182元性能测评
  • 资讯| 工信部拟筹建元宇宙标准化工作组;《权游》作者起诉OpenAI
  • Win10安装Docker Desktop并运行Tutorial示例
  • 1、靶机——Pinkys-Place v3(1)
  • 【AIGC】Stable Diffusion Prompt 每日一练0916
  • 【C语言】指针经典笔试题(上)
  • 缓存问题解决方案
  • 数据结构————寻路算法
  • 蓝桥杯 题库 简单 每日十题 day7
  • go -- 获取当前24点的时间戳 --chatGpt
  • docker 容器内手动设置服务自启动
  • 腾讯云微服务平台 TSF 异地多活单元化能力重磅升级
  • 01贪心:算法理论知识
  • 目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
  • PageHelp插件在复杂sql下引起的Having无法识别错误及其解决方案
  • linux中的开发工具
  • 2023 第十二届中国智能产业高峰论坛 - 文档大模型的未来展望
  • 【小沐学NLP】关联规则分析Apriori算法(Mlxtend库,Python)
  • 对话ChatGPT:AIGC时代下,分布式存储的应用与前景
  • java多线程学习笔记一
  • BOM与DOM--记录
  • Docker安装MongoDB
  • 不要对正则表达式进行频繁重复预编译