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

代码随想录算法训练营day60

文章目录

  • Day60
    • 柱状图中最大的矩形
      • 题目
      • 思路
      • 代码

Day60

柱状图中最大的矩形

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

题目

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

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

思路

本题和42. 接雨水 (opens new window),是遥相呼应的两道题目

接雨水要查找的是右边第一个比元素大的值进行计算,所以使用了递增单调栈(从栈口到栈底)

本题要查找的是右边第一个比元素小的值进行计算,所以使用了递减单调栈(从栈口到栈底)

本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!

栈顶和栈顶的下一个元素以及要入栈的三个元素组成了我们要求最大面积的高度和宽度

理解这一点,对单调栈就掌握的比较到位了。

除了栈内元素顺序和接雨水不同,剩下的逻辑就都差不多了,在题解42. 接雨水 (opens new window)我已经对单调栈的各个方面做了详细讲解,这里就不赘述了。

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

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

细节:

末尾为什么要加元素0?

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

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

开头为什么要加元素0?

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

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

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

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

代码

class Solution {public int largestRectangleArea(int[] heights) {int newHeights[] = new int[heights.length + 2];newHeights[0] = 0;newHeights[newHeights.length - 1] = 0;for(int i = 0; i < heights.length; i++) newHeights[i + 1] = heights[i];LinkedList<Integer> stack = new LinkedList<>();stack.push(0);int sum = 0;for(int i = 1; i < newHeights.length; i++){int position = stack.peek();if(newHeights[i] > newHeights[position]){stack.push(i);}else if(newHeights[i] == newHeights[position]){// 这里可以不做操作stack.pop();stack.push(i);}else{while(!stack.isEmpty() && newHeights[i] < newHeights[stack.peek()]){int mid = stack.peek();stack.pop();if(!stack.isEmpty()){int left = stack.peek();int right = i;int w = right - left - 1;int h = newHeights[mid];sum = Math.max(sum, w * h);}}stack.push(i);}}return sum;}
}
http://www.lryc.cn/news/114794.html

相关文章:

  • Modbus TCP转Profibus DP网关modbus tcp报文解析
  • 对 Promise 的理解
  • Vuex:Vue.js应用程序的状态管理模式
  • Unity之ShaderGraph 节点介绍 Utility节点
  • springboot()—— swagger
  • Java课题笔记~ 关联映射
  • 一零六七、JVM梳理
  • 【CSS】网格布局(简单布局、网格合并、网格嵌套)
  • 06 Ubuntu22.04上的miniconda3安装、深度学习常用环境配置
  • 【CSS3】CSS3 动画 ② ( 动画序列 | 使用 from 和 to 定义动画序列 | 定义多个动画节点 | 代码示例 )
  • 最优化:建模、算法与理论
  • 拿捏--->打印菱形
  • 【SpringBoot笔记】定时任务(cron)
  • Redis单机,主从,哨兵,集群四大模式
  • 2023年8月份华为H12-811更新了
  • [K8S:命令执行:权限异常:解决篇]:通过更新kubeconfig配置相关信息
  • 帆软设计器报表加载不出折线图的原因
  • [QCA6174]sdx12平台WiFi QCA6174在驱动加载的时候增加模块参数方法
  • Ajax-AJAX请求的不同发送方式
  • 简易图书管理系统(面向对象思想)
  • C++ 函数模板与类模板
  • Tailwind CSS:简洁高效的工具,提升前端开发体验
  • NR CSI(六) CSI reporting using PUCCH
  • 论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》
  • 5G上行干扰规避的参数策略
  • CTF流量题解tcp1
  • Django快速入门
  • Python “牵手” 淘宝商品详情数据获取方法,淘宝API申请指南
  • OpenScene
  • HDFS中的Trash垃圾桶回收机制