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

2024-08-24 01:28

本文主要是介绍学习记录: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 压入栈中,以便后续处理。

总结

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

这篇关于学习记录:js算法(十二):柱状图中最大的矩形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101058

相关文章

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一