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

栈----5.柱状图中最大的矩形

84. 柱状图中最大的矩形 - 力扣(LeetCode)

 /**

        矩形面积计算规则:

                以当前柱子为起点,向左寻找第一个更低的为左边界,向右寻找第一个更低的为右边界

                S = (right - left - 1) * heights[i]

        单调栈:

                双重循环暴力枚举寻找边界,O(n²); 引入单调栈一次遍历得出所有柱子左右边界

                首先将元素逐个入栈,栈中存放柱子索引

                若待入栈元素比栈顶元素小,栈顶元素右边界确定即为待入栈元素,弹出栈顶元素,重复上述流程直到栈为空或待入栈元素比栈顶元素大

                若待入栈元素比栈顶元素大,则待入栈元素左边界即为栈顶元素,入栈

        初始化:

                左边界初始化为-1;右边界初始化为heights.length

                     

*/

class Solution {/**矩形面积计算规则:以当前柱子为起点,向左寻找第一个更低的为左边界,向右寻找第一个更低的为右边界S = (right - left - 1) * heights[i]单调栈:双重循环暴力枚举寻找边界,O(n²); 引入单调栈一次遍历得出所有柱子左右边界首先将元素逐个入栈,栈中存放柱子索引若待入栈元素比栈顶元素小,栈顶元素右边界确定即为待入栈元素,弹出栈顶元素,重复上述流程直到栈为空或待入栈元素比栈顶元素大若待入栈元素比栈顶元素大,则待入栈元素左边界即为栈顶元素,入栈 初始化:左边界初始化为-1;右边界初始化为heights.length*/public int largestRectangleArea(int[] heights) {//初始化int len = heights.length;int[] left = new int[len];int[] right = new int[len];Arrays.fill(left,-1); //左边界初始化为-1;(左边没有更低的柱子)Arrays.fill(right,len); //右边界初始化为length;(右边没有更低的柱子)Deque<Integer> stack = new ArrayDeque<>();for(int i = 0; i < len; i++) {//待入栈元素比栈顶元素小,栈顶元素右边界确定即为待入栈元素while(!stack.isEmpty() && heights[i] < heights[stack.peek()]) {//栈顶元素右边界为待入栈元素,弹出栈顶元素int index = stack.pop();right[index] = i;}//待入栈元素比栈顶元素大,则待入栈元素左边界即为栈顶元素,入栈 if(!stack.isEmpty()) {left[i] = stack.peek();}//入栈,若栈为空也直接入栈,左边界为初始化的-1stack.push(i);}//左、右边界计算完毕 计算矩形面积int maxArea = 0;for(int i = 0; i < len; i++) {int area = (right[i] - left[i] - 1) * heights[i];maxArea = Math.max(maxArea,area);}return maxArea;}
}

http://www.dtcms.com/a/300559.html

相关文章:

  • 多模态视觉语言模型FILA-细粒度分辨率融合策略
  • 前缀和-560.和为k的子数组-力扣(LeetCode)
  • 望言OCR视频字幕提取2025终极评测:免费版VS专业版提全方位对比(含免费下载)
  • 3D芯片香港集成:技术突破与产业机遇全景分析
  • sealos 方式安装k8s5节点集群
  • CentOS 9 配置国内 YUM 源
  • Flutter开发实战之CI/CD与发布流程
  • Java AI面试实战:Spring AI与RAG技术落地
  • MySQL - 主从复制与读写分离
  • VILA系列论文解读
  • 预处理详解
  • rust-模块树中引用项的路径
  • PostgreSQL并发控制
  • Android:Reverse 实战 part 2 番外 IDA python
  • Android MQTT 长连接最佳实践技术分享
  • 力扣-76.最小覆盖子串
  • 安卓怎么做一个像QQ一样的开关切换控件
  • Kotlin位运算
  • EMCCD相机与电可调变焦透镜的同步控制系统设计与实现
  • Kotlin递归
  • MYSQL:索引
  • golang设置http代理
  • Flink2.0学习笔记:Stream API 常用转换算子
  • maven <dependencyManagement>标签的作用
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的人格品牌化实现路径研究
  • 常用git命令集锦
  • conda和pip安装包时的注意细节,以及下载慢时如何配置镜像地址
  • 积分兑换小程序Java
  • Megatron 中的 TensorParallel, PipelineParallel, ContextParallel,ExpertParallel
  • PHP框架之Laravel框架教程:3. 数据库操作(简要)