LeetCode--84. 柱状图中最大的矩形【单调栈】

devtools/2025/2/2 13:42:32/

84. 柱状图中最大的矩形


正文

题目如下

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

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

这道题暴力很简单,但是时间复杂度是O(N^2),在这里我们不予考虑,我在这里主要介绍一下单调栈的做法。

单调栈主要的思路就是,将遍历到的元素下标压入栈中,如果当前遍历的元素小于栈顶元素,就没有遵循单调的原则,需要先把栈中大于当前遍历到的数字的元素弹出,再把当前遍历的元素压入栈中,在这个过程中,我们还需要重新计算最大的矩形面积。

如何计算?

  • 首先我们需要明确,我们的栈是存储的下标,通过下标的差值我们可以计算出宽度,而且栈中元素是保持着单调递增的趋势,所以我们每次弹出的下标对应的数值都可以作为我们的矩形的高,这样便可以计算出我们的矩形面积。

为什么这样做能得出正确答案?

  • 首先,我们需要先了解一下暴力的做法,暴力是通过两个for循环遍历来实现的矩形的面积最大值计算,而单调栈是只在每次弹出元素的时候重新计算矩形面积,每个元素最多入栈,出栈一次,所以时间复杂度远小于暴力做法。
  • 但我们仔细想一下就能够知道,暴力做法是有很多多余的计算步骤的,比如以[1,2,3,4,5,6,1]为例子,遍历1的时候,会把2,3,4,5,6,1遍历完,显然效率很低,而单调栈在弹出元素时,能够确定,以当前下标对应的矩形的高的最大面积是多少,想清楚这一点,这道题就迎刃而解了。

下面是代码

func largestRectangleArea(heights []int) int {var st []intans := 0heights = append(heights, -1)for i := 0; i < len(heights); i ++ {for len(st) != 0 && heights[i] < heights[st[len(st) - 1]] {idx := st[len(st) - 1]st = st[:len(st) - 1]var l intif len(st) == 0 {l = -1} else {l = st[len(st) - 1]}ans = Max(ans, (i - l - 1) * heights[idx])}st = append(st, i)}return ans}func Max(a int, b int) int {if a >= b {return a}return b}

结语

这道题思路来源于bilibili,如果觉得不清晰可以看看这个视频。


http://www.ppmy.cn/devtools/155453.html

相关文章

手写MVVM框架-环境搭建

项目使用 webpack 进行进行构建&#xff0c;初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server&#xff0c;html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…

OpenCV:特征检测总结

目录 一、什么是特征检测&#xff1f; 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT&#xff08;尺度不变特征变换&#xff09; 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

人工智能入门课【手写自注意力机制】

原理 自注意力&#xff08;Self-Attention&#xff09;是一种强大的机制&#xff0c;广泛应用于自然语言处理、计算机视觉等领域&#xff0c;尤其是在Transformer架构中发挥了关键作用。它的核心思想是让模型能够动态地关注输入序列中不同位置之间的关系&#xff0c;从而更好地…

AI大模型开发原理篇-4:神经概率语言模型NPLM

神经概率语言模型&#xff08;NPLM&#xff09;概述 神经概率语言模型&#xff08;Neural Probabilistic Language Model, NPLM&#xff09; 是一种基于神经网络的语言建模方法&#xff0c;它将传统的语言模型和神经网络结合在一起&#xff0c;能够更好地捕捉语言中的复杂规律…

【Go语言圣经】第五节:函数

第五章&#xff1a;函数 5.1 函数声明 和其它语言类似&#xff0c;Golang 的函数声明包括函数名、形参列表、返回值列表&#xff08;可省略&#xff09;以及函数体&#xff1a; func name(parameter-list) (result-list) {/* ... Body ... */ }需要注意的是&#xff0c;函数…

RK3568 wifi使用(使用Linux指令操作)

文章目录 一、wifi扫描指令1. iwlist wlan0 scan2. iw dev wlan0 scan总结 二、连接wifi指令1. 使用 nmcli&#xff08;NetworkManager CLI&#xff09;连接 Wi-Fi 网络的步骤&#xff1a;备注&#xff1a; 2. 使用 iwconfig连接 Wi-Fi 网络的步骤&#xff1a;备注&#xff1a;…

力扣面试150 快乐数 循环链表找环 链表抽象 哈希

Problem: 202. 快乐数 &#x1f469;‍&#x1f3eb; 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…

vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列

最近在家过年闲的没事&#xff0c;于是研究起深度学习开发工具链的配置和安装&#xff0c;之前欲与天公试比高&#xff0c;尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境&#xff0c;最后惨败&#xff0c;沦为笑柄&#xff0c;痛定思痛&#xff0c;这次直接和…