代码随想录day60:贪心算法|84.柱状图中最大的矩形

84. Largest Rectangle in Histogram

在这里插入图片描述
进行优化,如果我们想获得left就给他left即可,我们只需要在求宽度的时候用到left,而没必要修改原数组。
所以给栈插入一个虚拟索引-1

思考过程

left应该为多少呢?
首先确定left是什么? left是索引,是左边界的柱子
那第一个元素是8的时候,他的面积怎么求的,不就是宽度1 * 高度8.
他的左边界应该是多少呢?
根据公式可得:
width = 1 - left - 1 == 1 ,可知left == -1 ! 害!这不就是索引0的左边吗?索引为-1
相当于给数组第一个元素左侧插入了一个虚拟元素嘛。

func largestRectangleArea(heights []int) int {
	heights = append(heights, 0)
	stack := []int{-1}
	maxArea := 0
	for i, h := range heights {
		for len(stack) > 1 && h < heights[stack[len(stack)-1]] { 
			height := heights[stack[len(stack)-1]]
			stack = stack[:len(stack)-1]           
			width := i - stack[len(stack)-1] - 1      
			maxArea = max(maxArea, height*width)
		}
		stack = append(stack, i) 
	}
	return maxArea
}

详解版

// 找每个柱子左右两侧第一个小于该柱子的柱子
// 找小的,需要维护一个单调递增栈
func largestRectangleArea(heights []int) int {
	// 结尾添加最小值0,让heights中最后一个元素可以出栈,计算它的面积!
	// 而且他还可以让所有留在栈中的元素都出栈[1,2,2,2,2,3],第一个2可是面积最大值,不能不计算!
	heights = append(heights, 0)
	stack := []int{-1} // 防止栈底元素弹出时,找不到左柱子
	maxArea := 0

	for i, h := range heights {
		// 维护递增栈,寻找两侧第一个小的竹子

		// 注意栈中第一个元素是-1,不属于heights中,不能进行判断,所以栈长度要>1
		for len(stack) > 1 && h < heights[stack[len(stack)-1]] { // 此时i为右侧第一个小于栈顶的,为右侧柱子
			height := heights[stack[len(stack)-1]] // 栈顶元素高度
			stack = stack[:len(stack)-1]           // 出栈

			//计算面积
			left := stack[len(stack)-1] // 此时栈顶为左侧第一个小于弹出的栈顶的,为左侧柱子
			width := i - left - 1       // 求两个柱子中间的距离,要-1
			maxArea = max(maxArea, height*width)
		}

		stack = append(stack, i) // 当前柱子入栈,记录索引值
	}
	return maxArea
}

Questions

问几个问题来检验一下自己的理解吧!

1. 为什么在heights添加最后一个元素0?

不仅可以让最后一个元素出栈,而且可以让所有的元素都可以出栈,可以计算每个元素的高度的面积
当heights=[1,2,2,2,2,2,2,3]中,如果不添加最后一个元素,单调递增,所有元素都不可以出栈!可第一个2是我们要找最大面积哦!

2. stack栈中为什么要插入一个-1?

这是一种优化哦!

3. 栈底元素一定是heights中第一个元素吗?

不一定

4. 判断栈操作中,为什么要判断栈长度>1而不是栈非空?

5. 卡哥代码中为什么可以不判断栈是否为空?

while (heights[i] < heights[st.top()])为什么可以不判断栈是否为空?

// 版本二
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int> st;
        heights.insert(heights.begin(), 0); // 数组头部加入元素0
        heights.push_back(0); // 数组尾部加入元素0
        st.push(0);
        int result = 0;
        for (int i = 1; i < heights.size(); i++) {
            while (heights[i] < heights[st.top()]) {
                int mid = st.top();
                st.pop();
                int w = i - st.top() - 1;
                int h = heights[mid];
                result = max(result, w * h);
            }
            st.push(i);
        }
        return result;
    }
};

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

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

相关文章

吴飞教授 人工智能 模型与算法 启发式搜索课件发散分析

一、文章介绍 本文是针对吴飞教授在MOOC课程 &#xff1a;《人工智能&#xff1a;模型与算法》 2.1节 启发式搜索的课前发散 在课程2.1节 启发式搜索章节中&#xff0c;吴飞教授以如何计算城市地图两点之间最短路径为例&#xff0c;重点讲授了贪婪最佳优先搜索和A*搜索算法&a…

Materialise Mimics各版本安装指南

Materialise Mimics下载链接 https://pan.baidu.com/s/1GYnAuXfbgk_n-OXLNSOt6w?pwd0531 1.鼠标右击【Materialise Mimics21】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Materialise Mimics21】。 2.打开解压后的文件夹&#xff0c;鼠…

网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】

网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站&#xff08;HTML静态网页项目实战&#xff09;附源码】 https://www.bilibili.com/video/BV1Hp4y1o7RY/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

大学物理-实验篇——用拉伸法测定金属丝的杨氏(弹性)模量(胡克定律、杨氏模量、平面反射镜、三角函数、螺旋测微器)

目录 预备知识 力学&#xff1a;胡克定律&#xff08;Hookes law&#xff09; 材料力学&#xff1a;杨氏模量 光学&#xff1a;平面反射镜 数学&#xff1a;三角函数 螺旋测微器 实验目的 实验仪器 实验原理 1.拉伸法测杨氏弹性模量 2.光杠杆放大法测量微小伸长量 …

Mac M1 Parallels CentOS7.9 Install Parallels Tools

一、挂载parallels-tools安装包 mkdir /media/cdrom/ mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护&#xff0c;将以只读方式挂载二、GCC升级 yum install -y centos-release-scl yum install -y devtoolset-8-gcc*# 切换当前会话中gcc版本为8 scl enable devtool…

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

重磅!图扑软件获评国家级专精特新“小巨人”企业

2023 年 7 月&#xff0c;工业和信息化部审核并公布了第五批国家级专精特新“小巨人”企业&#xff0c;图扑软件成功入选&#xff0c;荣膺国家级专精特新“小巨人”企业称号。 此次荣获国家级专精特新“小巨人”企业称号&#xff0c;不仅是对图扑软件在可视化和数字孪生领域专业…

ARCGIS PRO SDK Geoprocessing

调用原型&#xff1a;Dim gpResult AS IGPResult await Geoprocessing.ExecuteToolAsync(调用工具名称, GPValue数组, environment, null, null, executeFlags) 一、调用工具名称&#xff1a;地理处理工具名称。如面转线&#xff1a;management.PolygonToLine&#xff0c;而非…

实例:NodeJS 操作 Kafka

本人是C#出身的程序员&#xff0c;c#很简单就能实现&#xff0c;有需要的可以加我私聊。但是就目前流行的开发语言&#xff0c;尤其是面向web方向应用的&#xff0c;我感觉就是Nodejs最简单了。下面介绍&#xff1a; 本文将会介绍在windows环境下启动Kafka&#xff0c;并通过n…

java contains区分大小写吗?String的contains方法区分大小写

文章目录 一、contains区分大小写二、重写contains方法&#xff0c;实现忽略大小写 一、contains区分大小写 Java中的contains方法默认是区分大小写的&#xff0c;如果要忽略大小写&#xff0c;可以使用String类的equalsIgnoreCase()方法来代替。 Java中的contains方法默认是…

STM32CubeMX教程20 SPI - W25Q128驱动

目录 1、准备材料 2、实验目标 3、实验流程 3.0、前提知识 3.1、CubeMX相关配置 3.1.1、时钟树配置 3.1.2、外设参数配置 3.1.3、外设中断配置 3.2、生成代码 3.2.1、外设初始化调用流程 3.2.2、外设中断调用流程 3.2.3、添加其他必要代码 4、常用函数 5、烧录验…

React入门 - 02(工程目录结构解析)

本章内容 目录 1 外层“文件”说明2 各个“文件夹”说明 接着上一节的内容&#xff0c;我们继续这一节的内容–工程目录文件解析。打开上一节已经建好的工程 react-demo,详细的来了解一些里面的文件。 1 外层“文件”说明 .gitignore — 当我们使用 git 的时候&#xff0c;希…

听GPT 讲Rust源代码--compiler(31)

File: rust/compiler/rustc_ast_passes/src/node_count.rs 在Rust源代码的rust/compiler/rustc_ast_passes/src/node_count.rs文件中&#xff0c;它定义了Rust编译器中的AST节点计数器。该文件的作用是统计不同类型的AST节点在程序中的数量&#xff0c;以便在优化和调试过程中能…

FaceChain-FACT:免训练的丝滑体验,秒级别的人像生成

​ 项目主页&#xff1a;FaceChain-fact&#xff1a;Face Adapter for Human AIGC github项目&#xff1a;https://github.com/modelscope/facechain 1.介绍 作为AI人像写真开源项目的佼佼者&#xff0c;FaceChain凭借其丰富多样的风格模版和卓越的人像保真度&#xff0c;深…

【IPC通信--消息队列】

消息队列&#xff08;也叫做报文队列&#xff09;是一个消息的链表。可以把消息看作一个记录&#xff0c;具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息&#xff1b;对消息队列有读权限的进程则可以从消息队列中读走消息…

Type-C双盲插显示器,无需外挂MOS最简版本

在2021年5月&#xff0c;USB-IF协会破茧而出&#xff0c;发布了全新的USB PD3.1规范&#xff0c;如同凤凰涅槃&#xff0c;将快充功率上限从100 W扶摇直上至240 W。这一壮举不仅让USB PD的影响力渗透到手机、笔记本电脑的领域&#xff0c;更是将其触角延伸至了更为广阔的天地&a…

SpikingJelly笔记之泊松编码

文章目录 前言一、泊松编码的原理二、生成符合泊松分布的脉冲序列三、SpikingJelly中的泊松编码四、Lena图像的泊松编码与还原1.原始图像2.图像编码3.图像还原 总结 前言 记录SpikingJelly中泊松编码的使用方法&#xff0c;对图像数据进行编码与还原 一、泊松编码的原理 基于…

在版权付费方面,OpenAI 比人想象中的还要「小气」

随着新闻出版商与AI公司达成“使用新闻训练AI模型”的协议&#xff0c;像 OpenAI 等科技企业愿意为受版权保护的信息支付的价格逐渐浮出水面。 据 The Information 报道&#xff0c;OpenAI 每年愿意向出版商提供 100万到500万美元来支付受版权保护的新闻文章训练其AI模型。 但…

微软最新研究成果:使用GPT-4合成数据来训练AI模型,实现SOTA!

文本嵌入是各项NLP任务的基础&#xff0c;用于将自然语言转换为向量表示。现有的大部分方法通常采用复杂的多阶段训练流程&#xff0c;先在大规模数据上训练&#xff0c;再在小规模标注数据上微调。此过程依赖于手动收集数据制作正负样本对&#xff0c;缺乏任务的多样性和语言多…

成功面试软件工程师的关键素质

目录 前言1 过硬的技术1. 1 不断学习的重要性1.2. 编码实践的重要性1.3 技术分享促进个人成长 2 良好的沟通能力2.1 建立信任与共鸣2.2 沟通技巧的重要性2.3 构建积极的沟通氛围 3 具有良好的性格结语 前言 在当今科技飞速发展的时代&#xff0c;软件工程师作为技术领域的中流…