代码随想录——柱状图中最大的矩形(Leetcode 84)

news2024/12/23 14:48:31

题目链接
在这里插入图片描述

我的解法(暴力)

果不其然,超时是暴力解法的宿命…
双层for循环真的很好懂,每次解题都感觉我应该是一个单细胞生物…

class Solution {
    public int largestRectangleArea(int[] heights) {
        int max = 0;
        for(int i = 0; i < heights.length; i++){
            int commonHeight = heights[i];
            max = Math.max(max, commonHeight);
            for(int j = i + 1; j < heights.length; j++){
                commonHeight = Math.min(commonHeight, heights[j]);
                max = Math.max(max, commonHeight * (j - i + 1));
            }
        }
        return max;
    }
}

优秀题解

单调栈
思路:

  1. 初始化:定义一个栈 stack 用来存储柱子的索引,一个变量 max 用来记录遍历过程中计算出的最大矩形面积。

  2. 遍历数组:通过一个 for 循环遍历每个柱子的高度 heights[i]

  3. 维护栈的单调递减:在处理每个柱子时,如果栈不为空且当前柱子的高度小于栈顶柱子的高度,这意味着我们可以计算栈顶柱子能构成的矩形面积了。因为只有更矮的柱子才能限制栈顶柱子的宽度。计算方法是:

    • 弹出栈顶柱子的索引,得到其高度 h
    • 计算宽度 w:如果栈为空,说明栈顶柱子的左边没有柱子了,宽度就是当前索引 i;否则,宽度是当前索引 i 减去栈顶索引减去 1(因为栈顶索引包含在内)。
    • 更新 max 为当前计算的矩形面积和已有最大值中的较大者。
  4. 处理当前柱子:将当前柱子的索引 i 压入栈中。

  5. 处理剩余柱子:在数组遍历完成后,栈中可能还有一些柱子没有处理。这些柱子可以看作是到达了数组的末尾,因此它们的宽度是数组的长度减去栈顶索引再减去 1

这个算法的关键在于利用栈来维护一个单调递减的序列,这样可以在遍历数组的过程中找到每个柱子的最大矩形面积。算法的时间复杂度是 O(n),其中 n 是数组 heights 的长度。

class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> stack = new Stack<Integer>();
        int max = 0;
        for(int i = 0; i < heights.length; i++){
            while(!stack.isEmpty() && heights[stack.peek()] > heights[i]){
                int h = heights[stack.pop()];
                int w = stack.isEmpty() ? i : i - stack.peek() - 1;
                max = Math.max(max, h * w);
            }
            stack.push(i);
        }
        while(!stack.isEmpty()){
            int h = heights[stack.pop()];
            int w = stack.isEmpty() ? heights.length : heights.length - stack.peek() - 1;
            max = Math.max(max, h * w);
        }
        return max;
    }
}

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

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

相关文章

Java高效透明可靠 同城搬家系统小程序源码

高效透明可靠 —— 同城搬家系统 &#x1f69a;【开篇&#xff1a;告别繁琐&#xff0c;迎接高效搬家新时代】&#x1f69a; 搬家&#xff0c;对于很多人来说&#xff0c;都是一件既期待又头疼的事情。期待新家的温馨与美好&#xff0c;却又头疼于搬家的繁琐与复杂。但今天&a…

西湖大学卢培龙团队突破:精确从头设计异手性蛋白复合物,开启镜像蛋白研究新篇章

在生物科学的浩瀚星空中&#xff0c;蛋白质作为生命活动的基本承担者&#xff0c;其设计与合成一直是科学家们不懈探索的领域。近日&#xff0c;西湖大学卢培龙团队携手清华大学刘磊团队&#xff0c;在《Cell Research》期刊上发表了一项革命性的研究成果——首次实现了异手性蛋…

自组网融合通信方案技术详解

自组网&#xff08;Ad Hoc Network&#xff09;&#xff0c;又称无中心网络或多跳网络&#xff0c;是一种无需固定基础设施支持&#xff0c;由多个动态节点自组织形成的临时性通信网络。它具备高度的灵活性和鲁棒性&#xff0c;能够在复杂多变的环境中快速部署和自适应调整。自…

如何解决ValueError: could not convert string to float: ‘无数据‘

下面是一个Python脚本&#xff0c;用于检查数据中哪些列包含“无数据”字符串&#xff0c;并打印出这些列的名称和它们在数据集中的位置。 import pandas as pd# 加载数据&#xff08;替换为你的数据就行&#xff09; data pd.read_excel(WT10_operating_data.xlsx, engineope…

推荐一款开源、高效、灵活的Redis桌面管理工具:Tiny RDM!支持调试与分析功能!

1、引言 在大数据和云计算快速发展的今天&#xff0c;Redis作为一款高性能的内存键值存储系统&#xff0c;在数据缓存、实时计算、消息队列等领域发挥着重要作用。然而&#xff0c;随着Redis集群规模的扩大和复杂度的增加&#xff0c;如何高效地管理和运维Redis数据库成为了许…

监控文件文件夹被删除修改用哪个软件好

文件和文件夹的删除修改是很常见的操作&#xff0c;那么为什么需要监控它呢&#xff1f;自己使用的电脑可能对这方面的需求比较少&#xff0c;但是工作上的电脑一般都会有多个人去使用的&#xff0c;有时候一些文件或文件夹可能会被别个删除或修改&#xff0c;那么监控这些记录…

云计算之数据库

目录 一、RDS产品介绍及排障思路 1.1 云RDS数据库及其特点 1.2 云RDS数据库-规格 1.3 云RDS数据库-存储 ​1.4 云RDS数据库-安全 ​1.5 云RDS数据库-整体架构 1.6 RDS常见问题排查 ​1.6.1 如何解决无法链接RDS实例的问题 1.6.2 RDS实例存储空间使用率高&#xff0c;怎…

比特币客户端和API

1. 比特比客户端的安装 Bitcoin Core 客户端适用于从 x86 Windows 到 ARM Linux 的不同架构和平台&#xff0c;如下图所示&#xff1a; 2. Bitcoin Core客户端的类型 2.1 Bitcoind Bitcoind 末尾的字母 d 表示 daemon (守护程序&#xff09;。所谓守护程序&#xff0c;就是指常…

【完美解决】电脑蓝屏 驱动丢失或包含错误问题的解决办法

电脑开机出现了蓝屏报错进入恢复页&#xff1a; 无法加载操作系统&#xff0c;原因是关键系统驱动程序丢失或包含错误 文件 \windows\system32\XXXXX 错误代码&#xff1a;XXXX 重启无数次也不行&#xff0c;安全模式进不去&#xff0c;修复也不行 查了一圈&#xff0c;尝试了…

【深度学习详解】Task3 实践方法论-分类任务实践 Datawhale X 李宏毅苹果书 AI夏令营

前言 综合之前的学习内容&#xff0c; 本篇将探究机器学习实践方法论 出现的问题及其原因 &#x1f34e; &#x1f34e; &#x1f34e; 系列文章导航 【深度学习详解】Task1 机器学习基础-线性模型 Datawhale X 李宏毅苹果书 AI夏令营 【深度学习详解】Task2 分段线性模型-引入…

南通网站建设手机版网页

随着移动互联网的迅猛发展&#xff0c;越来越多的人通过手机浏览网页&#xff0c;进行在线购物、信息查询和社交互动。因此&#xff0c;建立一个适合移动端访问的网站已成为企业和个人不可忽视的重要任务。在南通&#xff0c;网站建设手机版网页的需求逐渐增加&#xff0c;如何…

springboot整合Logback

Logback介绍 描述 Logback是由log4j创始人设计的另外一种开源日志组件&#xff0c;性能比log4j要好。相对是一个可靠、通用、快速而又灵活的Java日志框架。 Logback主要分三个模块 1、logback-core&#xff1a;其他两个模块的基础模块 2、logback-classic&#xff1a;它是lo…

基于AIM平台实现对SAP PO平台的监控告警管理及WeLink告警案例

一、客户背景 某集团基于SAP PO平台统一管理的接口量较大&#xff0c;为了方便团队进行后期维护和管理&#xff0c;固上此AIM监控平台系统&#xff0c;用于接口日常运行、SAP PO各类型指标和系统性能方面的监控&#xff0c;多种告警类型渠道满足各种用户需求&#xff0c;采用…

ESP8266下载固件→连接阿里云

一、工具准备 1、ESP8266Wifi模块 2、ESP8266下载器 ESP8266-01模块 二、固件配置 CH340串口工具-烧录ESP8266-01固件_esp8266 ch340烧录-CSDN博客文章浏览阅读444次&#xff0c;点赞6次&#xff0c;收藏3次。CH340会有供电不足的问题&#xff0c;因此需要外部供电_esp…

【leetcode详解】清除数字:栈思想解决字符串问题(思路详解)

实战总结 string的常用方法&#xff1a; pop_back, push_back使得可以直接像操作栈一样操作string类型 注意&#xff0c;上面两个方法只能对单个字符char操作但是‘ ’对 char 和 string 均适用 题面 思路详解&#xff1a; 不妨对比一下其他思路&#xff1a; 双指针&#…

《高等代数》相邻两行(列)相差K倍行列式

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;相邻两行&#xff08;列&#xff09;相差K倍行列式需要关注行&#xff08;列&#xff09;与行&#xff08;列&#xff09;之间的关系&#xff0c;运用适当…

《卷积神经网络 CNN 原理探秘》

CNN基本原理详解 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;是一种前馈神经网络&#xff0c;人工神经元可以响应周围单元&#xff0c;可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…

实验室ICPR 2024论文分享┆DS MYOLO:一种基于状态空间模型的驾驶场景可靠目标检测器

论文分享简介 本推文详细介绍了一篇实验室的最新论文成果《DS MYOLO: A Reliable Object Detector Based on SSMs for Driving Scenarios》&#xff0c;该论文已被第27届国际模式识别大会&#xff08;ICPR&#xff09;接收&#xff0c;论文的第一作者为李杨。论文提出了一种基…

使用Cloudflare构建RAG应用;端到端语音开源大模型;AI幻灯片生成器,等六个开源项目

✨ 1: Cloudflare RAG 如何使用Cloudflare构建一个完整的RAG应用&#xff0c;结合多种搜索技术和AI服务。 Cloudflare RAG&#xff08;Retrieval Augmented Generation&#xff09;是一个全栈示例&#xff0c;展示如何使用 Cloudflare 构建 RAG 应用程序。该项目结合了 Cloud…

新能源车“卖电”有多赚?多地试点反向充电

新能源车“卖电”有多赚&#xff1f;多地试点车对桩反向充电 据经济观察报了解&#xff0c;在不同的城市&#xff0c;新能源车主参与车网互动获得的收益差异颇大。同时&#xff0c;有的车主担心增加充放电次数影响电池寿命&#xff0c;不愿意参与。 今年入夏以来&#xff0c;随…