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

073柱状图中最大的矩形

柱状图中最大的矩形

题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/?envType=study-plan-v2&envId=top-100-liked

我的解答:

//方法:单调栈 //时间复杂度:O(n) //空间复杂度:O(n) public int largestRectangleArea(int[] heights) { int ans = 0; int n = heights.length; Deque<Integer> stack = new LinkedList<>();//栈中存放下标,从栈底到栈顶的下标对应的高度递增 int ptr = 0; while(ptr < n || !stack.isEmpty()){ if(ptr < n && (stack.isEmpty() || heights[ptr] >= heights[stack.peek()])){ stack.push(ptr); ptr++; } else{ //收集当前栈顶元素的最大贡献度 int top = stack.pop(); int pre = stack.isEmpty() ? -1 : stack.peek(); int devote = heights[top] * (ptr - pre - 1); //更新答案 ans = Math.max(ans, devote); } } return ans; }

分析:代码的时间复杂度为O(n),空间复杂度为O(n)。解题思路:采用单调栈。栈中存放下标,从栈底到栈顶的下标对应的高度递增。遍历heights,若当前位置的高度大于或等于栈顶下标对应的高度,直接将当前位置入栈;若当前位置的高度小于栈顶下标对应的高度,就从栈中弹出一个下标并统计此下标对应位置的最大贡献度(从弹出下标往左找到第一个比它对应高度小的位置,也就是弹出它后的栈顶,假设为left,再从弹出下标往右找到第一个比它对应高度小的位置,也就是当前位置,假设为ptr,那么当前位置的最大贡献度就为:当前位置的高度与(ptr-left-1)的乘积),然后更新答案。重复以上操作直到遍历完heights数组的所有元素并且栈为空即可得出最后的答案。

看了官方题解后的解答:

//方法二:单调栈 + 常数优化 //时间复杂度:O(n) //空间复杂度:O(n) public int largestRectangleArea(int[] heights) { int n = heights.length; int[] left = new int[n]; int[] right = new int[n]; Arrays.fill(right, n); Deque<Integer> stack = new LinkedList<>();//栈中存放下标,从栈底到栈顶的下标对应的高度递增 for(int i=0; i<n; i++){ while(!stack.isEmpty() && heights[i] < heights[stack.peek()]){ right[stack.peek()] = i; stack.pop(); } left[i] = stack.isEmpty() ? -1 : stack.peek(); stack.push(i); } int ans = 0; for(int i=0; i<n; i++){ ans = Math.max(ans, heights[i] * (right[i] - left[i] - 1)); } return ans; }

分析:

​ 1、官方的解题思路与我的解题思路大体一致,但是官方用数组将统计出的每个位置左边第一个高度更小的位置和每个位置右边第一个高度更小的位置存储起来,最后根据两个数组来统计答案。而我的解答在弹出栈中元素时直接计算答案,逻辑上更难理解,在讲述思路时容易显得逻辑不清晰,官方的编码分步骤进行,在面试时更容易阐述思路。

总结

  • 本题主要需要分析出题目的类型,根据“从每个位置向左和向右扩展到的最远位置统计包含当前位置时,所能构成的最大矩阵”将题目转化为了“寻找每个位置往左和往右第一个高度小于当前位置的两个位置”,根据这个,我们就很容易想到单调栈。
http://www.zskr.cn/news/1434461.html

相关文章:

  • 别再乱点‘诊断启动’!一次Win10系统配置错误引发的BitLocker恢复密钥实战记录
  • 评测全网10款主流降AIGC软件:找到导师推荐的“无痕降AIGC”终极方案
  • 低查重AI写教材工具大揭秘,一键生成专业教材,开启教材编写新时代!
  • 告别论文内耗!百考通AI四步闭环,高效搞定学术写作
  • 强力防撤回工具:3分钟掌握微信QQ消息永久保存秘诀
  • 苏州蔷薇吊装搬运:苏州道路救援公司 - LYL仔仔
  • 人机协作新范式:盘点2026年最受喜爱的的降AIGC工具
  • 无锡蔷薇动能科技:宜兴靠谱的升降车租赁找哪家 - LYL仔仔
  • AI生成教材新趋势!低查重工具助力,实现高效教材编写!
  • 上海A级纳税防水公司哪家靠谱?芮生建设A级纳税彰显正规实力 - 十大品牌榜单
  • QuickRecorder:让macOS录屏变得简单高效的5个秘密武器
  • 别再死记硬背CNN结构了!用PyTorch从零搭建猫狗分类器,带你理解每一行代码
  • 沭阳智赛交通设施:云龙小区划线标线公司 - LYL仔仔
  • XGBoost + SHAP 一键生成 10 张出版级模型解释图
  • 如何用Untrunc快速修复损坏的MP4视频文件:终极完整指南
  • 终极解决方案:用.NET Windows Desktop Runtime彻底告别Windows应用部署难题
  • 低查重AI写教材大揭秘!高效工具推荐,快速生成优质教材!
  • 彻底解放你的Mac光标:Mousecape自定义鼠标指针完全指南
  • 无锡木木金银回收:滨湖专业的首饰回收选哪家 - LYL仔仔
  • Foresight研究报告【20260013】
  • WebLaTeX:3分钟掌握云端LaTeX写作的终极免费解决方案
  • 上海湘杰仪器仪表:淮安海绵压陷试验机怎么联系 - LYL仔仔
  • 如何用ChineseSubFinder实现影视库全自动中文字幕管理?
  • Linux下手动安装JDK
  • 5分钟解锁游戏性能:DLSS Swapper如何智能管理你的DLSS版本
  • 3个关键技巧解决ODrive电机控制中的常见性能问题
  • 基于74HC系列芯片与L293D的硬件密码锁电机驱动电路设计
  • 如何高效构建12306分布式购票系统:从零到一的完整实战指南
  • Arduino弯曲传感器与Unity交互:打造物理游戏控制器全流程指南
  • AI大模型小白入门必看:收藏这份高效学习指南,拥抱智能未来!