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

学习记录:js算法(十二):柱状图中最大的矩形

文章目录

    • 柱状图中最大的矩形
      • 我的思路
      • 网上思路
    • 总结

柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述

示例 1:上图
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10示例 2:下图
输入: heights = [2,4]
输出: 4

在这里插入图片描述

我的思路
首先我想用栈来解决,但是想了半天没思路,算了,还是用循环吧
网上思路

我的思路

var largestRectangleArea = function (heights) {let maxArea = 0;const n = heights.length;for (let i = 0; i < n; i++) {let minHeight = heights[i];for (let j = i; j < n; j++) {minHeight = Math.min(minHeight, heights[j]);const width = j - i + 1;maxArea = Math.max(maxArea, minHeight * width);}}return maxArea;
};

讲解

  1. 既然要求找出最大面积,那就定义一个参数 maxArea 来保存它
  2. 矩形面积 = 长 * 宽, 所以一个循环肯定不行,得双重循环。毕竟,我可以设置第一个柱子为起点,任意一个柱子为终点来计算他们的 长度*最小柱子高度
  3. 循环中设置最小高度,然后双重循环中,计算面积,每次计算的面积都要和最大面积进行比较,找出哪一个是最大面积。
  4. 差点忘记说明长度了,其实很好理解,无论你选择哪一个柱子为起点,哪一个柱子为终点,它的长度都是 终点 - 起点 + 1,比如起点和终点都是第一个,1-1+1=1

网上思路

 const stack = [];let maxArea = 0;heights.push(0); // 在最后添加一个高度为0的柱子,确保栈能清空for (let i = 0; i < heights.length; i++) {while (stack.length > 0 && heights[i] < heights[stack[stack.length - 1]]) {const h = heights[stack.pop()]; // 弹出栈顶元素const width = stack.length === 0 ? i : i - stack[stack.length - 1] - 1; // 计算宽度maxArea = Math.max(maxArea, h * width); // 更新最大面积}stack.push(i); // 将当前柱子的索引压入栈中}return maxArea;

讲解
说实话,看到这个解答的时候,第一眼就是好麻烦,因为阅读起来真的小难。。。

  1. stack: 用于存储柱子的索引。
  2. maxArea: 用于记录当前找到的最大矩形面积。
  3. heights.push(0): 在数组末尾添加一个高度为0的柱子,这是为了确保在遍历结束时能够清空栈,计算出所有可能的矩形面积。
  4. 使用 for 循环遍历每个柱子的索引 i
  5. 如果栈为空,说明当前弹出的柱子是最矮的柱子,宽度就是 i从 0 到 i 的所有柱子都可以形成矩形)。
  6. 如果栈不为空,说明当前的矩形宽度是从栈顶元素的下一个索引到当前索引 i,即 i - stack[stack.length - 1] - 1
  7. 计算当前矩形的面积 h * width,并更新 maxArea,确保它总是保持最大的矩形面积。
  8. while 循环结束后,将当前柱子的索引 i 压入栈中,以便后续处理。

总结

栈学的不是很好,因为相比较于栈,我还是比较用数组比较熟练。


http://www.mrgr.cn/news/7130.html

相关文章:

  • 【联想电脑】:使用拓展坞后转接HDMI,无法识别显示屏
  • 接口限流经典算法
  • 设计模式之抽象工厂
  • day33(mysql57主从从+mycat读写分离+java项目结合mycat数据库+lvs_dr轮询调用java项目)
  • 程序和进程,PID,创建进程-multiprocessing模块的Process类, Pool 类,Queue类(多任务-多进程)
  • 查询 MySQL、SQL Server 和 Oracle 数据库编码(字符集)的方法
  • Python酷库之旅-第三方库Pandas(093)
  • 【前端面试】操作系统(二)
  • Raft算法——Leader Completeness Property(领导者完整性属性)
  • 打卡53天------图论(应用题)
  • Django对RawQuerySet进行计数
  • API容易被攻击,如何做好API安全
  • 25考研计算机组成原理复习·4.1指令系统/4.2指令的寻址方式
  • 如何保证Redis与数据库之间的一致性
  • 回归预测 | Matlab实现WOA-ESN鲸鱼算法优化回声状态网络多输入单输出回归预测
  • 开放式耳机有什么好处?权威推荐5个实用好用品牌
  • Nginx IP 限制与路径访问控制配置
  • aosp源码导入android studio无法跳转-学员答疑
  • Web应用加密数据传输方案
  • 【计算机组成原理】三、存储系统:5.页式存储、虚拟存储