LeetCode - #84 柱状图中最大的矩形(Top 100)

news2024/11/19 13:43:52

文章目录

    • 前言
    • 1. 描述
    • 2. 示例
    • 3. 答案
      • 题解 1
      • 题解 2
    • 关于我们

在这里插入图片描述

前言

本题为 LeetCode 前 100 高频题

本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。

我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。

LeetCode 算法到目前我们已经更新到 83 期,我们会保持更新时间和进度(周一、周三、周五早上 9:00 发布),每期的内容不多,我们希望大家可以在上班路上阅读,长久积累会有很大提升。

不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。

难度水平:困难

1. 描述

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

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

2. 示例

示例 1

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

示例 2

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4

3. 答案

题解 1

class Solution {
   func largestRectangleArea(_ heights: [Int]) -> Int {

   if heights.count == 0 {
       return 0
   }

           if heights.count == 1 {
       return heights[0]
   }
   var leftIndexes = Array<Int>.init(repeating: 0, count: heights.count)
   var rightIndexes = Array<Int>.init(repeating: 0, count: heights.count)
   leftIndexes[0] = -1
   rightIndexes[heights.count - 1] = heights.count

   for i in 1..<heights.count {
       var p = i - 1
       while p >= 0, heights[p] >= heights[i] {
           p = leftIndexes[p]
       }
       leftIndexes[i] = p
   }

   for i in (0...heights.count - 2).reversed() {
       var p = i + 1
       while p < heights.count, heights[p] >= heights[i] {
           p = rightIndexes[p]
       }
       rightIndexes[i] = p
   }
   var maxArea = 0
   for i in 0..<heights.count {
       maxArea = max(maxArea, heights[i] * (rightIndexes[i] - leftIndexes[i] - 1))
   }

   return maxArea
   }
}

题解 2

class Solution {
   func largestRectangleArea(_ heights: [Int]) -> Int {

       let heights = heights + [0]

       var indexStack: [Int] = []
       var maxHeight = 0

       for (i,height) in heights.enumerated() {

           while let previousIndex = indexStack.last, heights[previousIndex] > height {
               indexStack.removeLast()

               let lastIndex = indexStack.last ?? -1
               let width = (i-1) - lastIndex
               let height = heights[previousIndex]

               maxHeight = max(maxHeight, width * height)
           }

           indexStack.append(i)
       }

       return maxHeight
   }
}

点击前往 LeetCode 练习

关于我们

我们是由 Swift 爱好者共同维护,我们会分享以 Swift 实战、SwiftUI、Swift 基础为核心的技术内容,也整理收集优秀的学习资料。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习(三)线性回归原理

上述考虑的问题&#xff0c;我们会得到一个式子&#xff0c;即&#xff1a;Yθ1X1θ2X2。但该线性公式没办法拟合所有的数据点&#xff0c;如下图。 这里“θ0”作为偏置项&#xff0c;在二维平面里&#xff0c;即为截距。因此&#xff0c;上述公式“Yθ1X1θ2X2”即可修改为“…

深入源码解析 ReentrantLock、AQS:掌握 Java 并发编程关键技术

前言Lock重入锁synchronizedReentrantLock ReentrantReadWriteLock 读写锁ReentrantLock 实现原理AQSAQS 内部实现Node 内部结构Node 变更过程添加节点释放节点 ReentrantLock 类源码分析时序图锁竞争核心方法NonfairSync#lockAQS#acquireReentrantLock.NonfairSync#tryAcquire…

js的 Babel原理

简介 babel是一个JavaScript编译器,可以将ES2015 转换为向后兼容的JavaScript代码, Babel的原理是将JavaScript代码分为三个阶段: 解析, 转换和输出 1. 解析阶段 Babel首先会使用 Babylon 解析器将输出的 ES2015diamagnetic解析成抽象语法树(AST), 抽象语法树是 一种JSON形式…

端午节,不能只知道吃吃吃.....玩玩玩......

系列文章目录 作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;…

FWI 地震数据的认识

目录 1、数据来源。 1&#xff09;SEG 系列。 2&#xff09;OpenFWI 系列。 2、数据量&#xff0c;尺寸。 1&#xff09; SEG 包含两个数据集&#xff1a;SEGSaltData 和 SimulateData。 2&#xff09;OpenFWI 包含12个数据集&#xff1a; 3、地震数据对应的观测系统。…

Redis原理 - IO详解

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis原理 - IO详解 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-IO.html 用户空间与内核空间 任何Linux 系统的发行版&#xff0c;其系统内核都是 Linux 。我们的应用都需要通过 Linux 内核与硬…

02py游戏开发基础

版本 pygame 2.4.0 (SDL 2.26.4, Python 3.8.2) Hello from the pygame community. https://www.pygame.org/contribute.html Python开发基础 Pygame常用模块 background_image_filename "bg.jpg"#设置图像文件名称 mouse_image_filename "ship.bmp"# 将…

JVM优化00

JVM优化 0.目标 了解下我们为什么要学习JVM优化掌握jvm的运行参数以及参数的设置掌握jvm的内存模型&#xff08;堆内存&#xff09;掌握jmap命令的使用以及通过MAT工具进行分析掌握定位分析内存溢出的方法掌握jstack命令的使用掌握VisualJVM工具的使用 1.为什么学习JVM优化 …

LeetCode - #82 删除排序链表中的重复元素 II

文章目录 前言1. 描述2. 示例3. 答案关于我们 前言 我们社区陆续会将顾毅&#xff08;Netflix 增长黑客&#xff0c;《iOS 面试之道》作者&#xff0c;ACE 职业健身教练。&#xff09;的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新…

异常的介绍与处理

目录 第七章 异常 1.异常 2.处理方法 2.1.try-catch 2.2.多重catch块 2.3.finally 2.4.throw 与 throws 2.5.程序分析 3.自定义异常 内容仅供学习交流&#xff0c;如有问题请留言或私信&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 有空您就点点赞…

【计算机视觉】计算机视觉的简单入门代码介绍(含源代码)

文章目录 一、介绍二、项目代码2.1 导入三方包2.2 读取和展示图片2.3 在图像上绘画2.4 混合图像2.5 图像变换2.6 图像处理2.7 特征检测 一、介绍 计算机视觉是一门研究计算机如何理解和解释图像和视频的学科。 它的目标是让计算机能够模拟人类视觉系统&#xff0c;让它们能够识…

Vivado 下 LED 灯闪烁实验

目录 Vivado 下 LED 灯闪烁实验 1、简介 2、实验环境 3、实验任务 4、硬件设计 5、程序设计 5.1、LED 闪烁模块代码 5.2、Vivado 仿真验证 5.2.1、编写 TB 仿真代码 6、下载验证 6.1、添加约束文件 .xdc 6.2、下载验证 注意&#xff1a;一定要先把下载器的一端连接…

FDM3D打印系列——2、一些基础概念

大家好&#xff0c;我是阿赵。 在买3D打印机之前&#xff0c;一般都会很迷茫&#xff0c;不知道3D打印机是怎样工作的&#xff0c;也不知道有哪些地方需要注意。上一篇文章通过打印一个模型&#xff0c;完整的体验了一次FDM打印3D模型的过程。这里解释一些在3D打印里面的比较基…

PMP考试自学可以吗?

PMP考试不建议自学&#xff0c;听劝&#xff0c;不该省的别省。 PMP现在没有自学了&#xff0c;今年3月的考试报了培训班的同学都说难&#xff0c;培训班的资源老师的专业&#xff0c;怎么也比自己单打独斗强吧&#xff0c;真的报培训班省事很多。 PS&#xff1a;网上说包过的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构&#xff0c;X86架构的CPU是PC服务器行业的老大&#xff0c;ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别&#xff0c;很多用户不理解它们两个之间到底有哪些区别&#xff0c;实际就是它们的领域不太相同…

Liunx安装window中文字体解决中文变方框问题

问题现象描述 没安装中文字体&#xff0c;有可能导致你的程序在windows上运行的好好的&#xff0c;部署到linux上运行就可能出现汉字变成小方块的问题&#xff0c;场景举例&#xff1a;svg文件转png图片&#xff0c;原svg中的中文会变成方框 按如下方法安装中文字体后&#xf…

南卡OE骨传导开放式蓝牙耳机评测!舒适与音质并存!

平时买耳机的时候&#xff0c;你最先会关注什么方向呢&#xff1f;是舒适、美观&#xff0c;还是音质、防水&#xff1f; 对于我来说&#xff0c;首先是功能。作为一个经常健身、跑步的人&#xff0c;最讨厌的就是平时运动流汗进入耳朵之后那种粘腻感觉。时间长了还容易让耳道…

凹下去的白色按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>凹下去的按钮</title><style>import url("https://fonts.googleapis.com/css2?famil…

【SIGMOD 2023】深度学习弹性数据流水线系统GoldMiner,大幅提升任务和集群效率

第一板块&#xff1a;开篇 近日&#xff0c;阿里云机器学习平台PAI和北京大学杨智老师团队合作的论文《GoldMiner: Elastic Scaling of Training Data Pre-Processing Pipelines for Deep Learning》被数据库领域顶会SIGMOD 2023接收。 GoldMiner观察到深度学习任务中的数据预…

redis登录常见报错

第一次接触redis登录的时候遇见几个报错 一、使用以下两个命令报错&#xff1a; ./redis-cli -h 127.0.0.1 -p 6380 ./redis-cli -p 6380 报错&#xff1a;Could not connect to Redis at 127.0.0.1:6380: Connection refused 应该和redis.conf中配置的bind字段的IP有关…