当前位置: 首页 > 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.cnnetsun.cn/news/2674551.html

相关文章:

  • MegSpot:5个高效技巧助你掌握跨平台视觉分析工具
  • MegSpot终极指南:高效专业的多媒体对比分析工具
  • 基于树莓派与HX711的智能饮水提醒系统:从传感器到完整IoT项目实践
  • 甲言(Jiayan):古汉语NLP处理的革命性突破与实战指南
  • 华硕笔记本轻量控制神器G-Helper:告别臃肿Armoury Crate的终极解决方案
  • 基于Arduino Uno与1602 LCD的复古像素游戏开发实战
  • QMCDecode:Mac用户终极免费工具,快速解锁QQ音乐加密音频文件
  • 【监管合规优先的Gemini年报工作流】:嵌入证监会/SEC双准则校验模块的6层风险拦截机制
  • Win-PS2EXE终极指南:3分钟将PowerShell脚本变专业Windows程序
  • 英雄联盟Akari助手:从手动操作到智能辅助的完整技术指南
  • 从‘42欧姆’和‘55欧姆’说起:聊聊同轴电缆阻抗不标准背后的那些事儿(附TDR实测)
  • 9大网盘下载助手:告别限速困扰,一键获取真实下载链接
  • 基于构件的软件开发模型
  • 基于Playwright与FFmpeg的会议自动化工具:Zoombot实现原理与实践
  • 从ArtStation大神作品反推:用Substance Designer制作PBR丝绸贴图并在Unity中还原
  • RevitLookup终极指南:深度解析BIM数据透视与调试技术
  • 树莓派蓝牙自动连接与音频播放系统:智能家居场景化应用实践
  • 如何快速掌握G-Helper:3个实用技巧让你的华硕笔记本性能翻倍
  • 3分钟恢复Windows 11任务栏拖放功能:开源修复工具的完整解决方案
  • 经验总结与未来展望:Function Calling 工具生态的演进方向
  • DIY金属弹药箱硬盘阵列:打造坚固便携的四盘位移动存储中心
  • 电力系统恶意数据检测:基于SMOTE与XGBoost集成的不平衡分类实战
  • Gemini翻译准确率暴跌?欧洲12国语言本地化测试数据曝光:3个隐藏参数决定90%质量差异
  • 思源宋体CN终极指南:免费开源中文字体一站式解决方案
  • 终极ncmdumpGUI指南:3步解锁网易云音乐NCM文件,实现音乐自由播放
  • 基于Arduino与IMU的DIY头部追踪系统:从传感器融合到FPV云台控制
  • 别只盯着文件上传:从CVE-2022-25578看.htaccess配置不当引发的连锁安全风险
  • 基于Arduino与超声波传感器的双模交互式音频控制器设计与实现
  • 3分钟掌握DRG存档编辑器:轻松定制你的深岩银河游戏体验
  • 基于树莓派的室内空气质量监测系统:从硬件选型到Web可视化全流程实践