LeetCode:柱状图中最大的矩形

文章收录于LeetCode专栏
LeetCode地址


柱状图中最大的矩形

题目

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

  • 示例1

在这里插入图片描述

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

  • 示例2
    在这里插入图片描述

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

双指针暴力法

算法思路

  算法题目是需要从给定的柱子中寻找两个柱子包裹形成面积最大矩形,即两个柱子间的间距为矩形的宽,两个柱子较短的一个的高为矩形的高。暴力法其实就是经过一次遍历,以每次得到的柱子的高度作为原点左右扩散,寻找第一个小于当前柱子高度的柱子作为边界。
  为什么要寻找第一个小于当前柱子高度的柱子呐?因为只要有小于当前柱子高度的柱子,就说明不能再以当前遍历所得到的柱子的高度为矩形的高计算面积。
  核心思想就是寻找第一个小于当前柱子高度的柱子作为边界。
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

编码

class Solution {
    public int largestRectangleArea(int[] heights) {
        if(heights.length == 0){
            return 0;
        }
        int max = 0;
        for(int i=0; i<heights.length; i++){
            int height = heights[i];
            int leftWeight = 0;
            int rightWeight = 0;
            
            for(int j=i-1; j>=0; j--){
                // 向左寻找第一个小于height的柱子
                if(heights[j] < height){
                    break;
                }else{
                    leftWeight = leftWeight + 1;
                }
            }
            
            for(int k=i+1; k<heights.length; k++){
                // 向右寻找第一个小于height的柱子
                if(heights[k] < height){
                    break;
                }else{
                    rightWeight = rightWeight + 1;
                }
            }
            int temp = height * (leftWeight + rightWeight + 1);
            max = Math.max(temp, max);
        }
        return max;
    }
}

复杂度分析

  因为整个算法没有使用额外的内存空间,所以空间复杂度为O(1),时间复杂度为O( N 2 N^2 N2)。

栈辅助(单调栈)

算法思路

  暴力法主要耗时在以某个柱子为高左右探测边界,那么有什么办法能避免左右探测边界的过程吗?
  算法常用的套路就是用空间换时间,同样这里也可以使用一个栈来辅助完成最大面积的求解。之所以选择使用栈来做辅助空间,是因为可以在遍历柱子的过程中,使用栈先进后出的特性来构造一个单调递增的结构。
  为什么要构造一个单调递增的结构呢?主要是因为只要后一个柱子的高度比前一个柱子高,则就可以将前一个柱子的高当做矩形的高。这样一来在遍历的过程中,只要后一个柱子比栈顶柱子(前一个柱子)的高度高,就入栈;如果后一个柱子比栈顶柱子矮,那么就需要将当前栈顶柱子出栈,并且以出栈柱子的高计算面积。
  这里巧妙的利用单调递增的结构来避免了左右探测,之所以能这么做其核心思想还是寻找第一个小于以某个柱子为高计算面积的柱子作为边界。
  特别注意,这里栈中存放的是柱子在数组中对应的位置,便于计算宽度。
在这里插入图片描述

编码

class Solution {
    public int largestRectangleArea(int[] heights) {
        if(heights.length == 0){
            return 0;
        }
        
        int[] arrys = new int[heights.length + 2];
        for(int i=0; i<heights.length; i++){
            arrys[i+1] = heights[i];
        }
        
        int max = 0;
        
        // 定义栈用于构造单调递增结构
        Stack<Integer> stack = new Stack<>();
        // 放入arrys数组中第0位元素作为哨兵
        stack.push(0);
        for(int i=1; i<arrys.length; i++){
            while(arrys[i] < arrys[stack.peek()]){
                // 如果新入栈柱子的高度小于栈顶柱子的高度
                // 就将栈顶柱子出栈,并以此为高度计算面积
                int temp = arrys[stack.pop()] * (i - stack.peek() - 1);
                max = Math.max(max, temp);
            }
            // 新柱子入栈,保证栈内柱子单调递增
            stack.push(i);
        }    
        return max;
    }
}

复杂度分析

  • 时间复杂度:O(N),输入数组里的每一个元素入栈一次,出栈一次。
  • 空间复杂度:O(N),栈的空间最多为 N。

一键三连,让我的信心像气球一样膨胀!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FastAPI单元测试:使用TestClient轻松测试你的API

当使用FastAPI进行单元测试时&#xff0c;一个重要的工具是TestClient类。TestClient类允许我们模拟对FastAPI应用程序的HTTP请求&#xff0c;并测试应用程序的响应。这使我们能够在不启动服务器的情况下对API进行全面的测试。 下面我将详细讲解TestClient的使用方法和常见操作…

empirecms 文件上传 (CVE-2018-18086)

漏洞环境&#xff1a;vulfocus 到管理后台 使用用户名密码&#xff1a;admin:123456登录&#xff0c;然后到后台找到文件上传点 发现需要后缀名为.mod 创建生成一句话木马的php脚本&#xff0c;并添加.mod后缀名&#xff0c;然后提交 <?php file_put_contents("shell…

攻防世界---web---warmup

1、题目描述 2、查看源码&#xff0c;发现有个source.php 3、访问该文件&#xff0c;得到这一串代码 4、分析代码 5、访问hint.php&#xff0c;提示flag在ffffllllaaaagggg这个文件下 6、构造payload ?filesource.php?/../../../../../../ffffllllaaaagggg

网络性能与流量监控:优化企业网络管理的关键策略

目录 网络性能监控的重要性 1. 提高网络可靠性 2. 优化网络资源使用 3. 提升用户体验 网络流量监控的必要性 1. 识别异常流量 2. 改善网络管理 3. 确保合规性 AnaTraf网络流量分析仪&#xff1a;提升网络监控效率的利器 如何实施有效的网络监控策略 1. 确定监控目标…

php发送短信功能(创蓝短信)

一、以下是创蓝发送短信的功能&#xff0c;可以直接执行&#xff1a; <?php$phone 12312312312;$msg 测试短信功能;echo 发送手机号&#xff1a;.$phone.<br/>;echo 发送内容&#xff1a;.$msg.<br/>;$send sendMessage($phone, $msg);var_dump($send);…

2024电工杯数学建模 - 案例:最短时间生产计划安排

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor/article/details/138726153 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#xff0c;预测2022今年国赛也会与该模型相关。 1 模型描…

BUUCTF---misc---我吃三明治

1、下载附件是一张图片 2、在winhex分析&#xff0c;看到一串整齐的编码有点可疑&#xff0c;保存下来&#xff0c;拿去解码&#xff0c;发现解不了&#xff0c;看来思路不对 3、再仔细往下看的时候也发现了一处这样的编码&#xff0c;但是这次编码后面多了一段base编码 4、拿去…

抖音小店什么产品最好卖?六月份的必爆产品!商家抓紧上架!

哈喽~我是电商月月 做抖音小店&#xff0c;爆款是非常吃香的&#xff0c;但普通玩家只有在爆款出来的那几天才能发现&#xff0c;再去截流&#xff0c;其实热度已经不高了&#xff0c;那想吃到这一口“螃蟹”只能自己去挖掘 每年爆的产品就是那几种&#xff0c;我们可以朝这几…

java自学阶段二:JavaWeb开发--day04(Maven学习)

day04学习笔记 一、学习目标 1.了解maven的基础概念&#xff1b; 2.学会maven的部署&#xff1b; 3.maven的作用&#xff1a;标准化&#xff1b;方便找依赖 maven就是一个开源项目&#xff0c;专门用来管理和构建Java项目的&#xff1b;我们自己写的项目结构可能会千奇百怪&am…

OpenAI 与 Reddit 达成重要合作伙伴关系

Reddit是一个娱乐、社交及新闻网站&#xff0c;注册用户可以将文字或链接在网站上发布&#xff0c;使它基本上成为了一个电子布告栏系统。注册用户可以对这些帖子进行投票&#xff0c;结果将被用来进行排名和决定它在首页或子页的位置。网站上的内容分类被称为“subreddit”。s…

列表的创建和删除

目录 使用赋值运算符直接创建列表 创建空列表 创建数值列表 删除列表 自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501\ 对于歌曲列表大家一定很熟悉&#xff0c;在列表中记录着要播放的歌曲名称…

ROS 手眼标定 realsense435+ur5e

手眼标定的原理 基坐标系&#xff08;base_tree&#xff09;和相机&#xff08;camera_tree&#xff09;两个坐标系属于不同的tree&#xff0c;通过将标签贴到手上&#xff0c;相机识别出标签的position和orention&#xff0c;并通过easy_handeye标定包得到tool0(机械手)&…

Docker 部署Jenkins

1、运行镜像 docker run --namejenkins \--restartalways \--privilegedtrue \-u root \-p 8080:8080 \-p 50000:50000 \-v /home/docker/jenkins/jenkins_home:/var/jenkins_home \-v /usr/bin/docker:/usr/bin/docker \-v /var/run/docker.sock:/var/run/docker.sock \-e TZ…

Java面试八股之有哪些线程安全的集合类

Java中有哪些线程安全的集合类 在Java中&#xff0c;并非所有的集合类都是线程安全的&#xff0c;但在多线程环境下&#xff0c;确保集合操作的线程安全性至关重要。以下是几个典型的线程安全集合类&#xff1a; Vector: 类似于ArrayList&#xff0c;但它是线程安全的。它通过…

【学习笔记】后端(Ⅰ)—— NodeJS(Ⅰ)

NodeJS 1、概述 1.1、NodeJS是什么 1.2、NodeJS的主要作用 1.3、NodeJS的优点 1.4、NodeJS 与 浏览器 的 JavaScript 对比 1.4.1 ECMAScript 介绍 1.4.2 JavaScript 介绍 1.4.3 TypeScript 介绍2、基础篇 2.1、Buff…

技术专家分享 | OPENAIGC开发者大赛能量加油站6月1日场预约开启~

由联想拯救者、AIGC开放社区、英特尔联合主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”自上线以来&#xff0c;吸引了广大开发者的热情参与。 为了向技术开发者、业务人员、高校学生、以及个体创业人员等参赛者们提供更充分的帮助与支持&#xff0c;AIGC开放社区特别…

半导体测试基础 - AC 参数测试

AC 测试确保 DUT 的时特性序满足其规格需求。 基本 AC 参数 建立时间(Setup Time) 建立时间指的是在参考信号(图中为 WE)发生变化(取中间值 1.5V)前,为了确保能被正确读取,数据(图中为 DATA IN)必须提前保持稳定不变的最短时间。在最小建立时间之前,数据可以随意变…

【python】python省市水资源数据分析可视化(源码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

今年为什么有这么多商家转战到视频号小店?有钱不赚那是“傻子”

大家好&#xff0c;我是电商小V 对于了解电商的玩家来说&#xff0c;今年很多玩家都发现一个现象那就是很多的抖音电商玩家都开了视频号小店&#xff0c;这是因为抖音小店不好做了吗&#xff1f;其实并不是的&#xff0c;抖音小店依旧是可以操作的&#xff0c;但是视频号小店是…

赛事|基于SprinBoot+vue的CSGO赛事管理系统(源码+数据库+文档)

CSGO赛事管理系统 目录 基于SprinBootvue的CSGO赛事管理系统 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3参赛战队功能模块 4合作方功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…