【每日一题】好子数组的最大分数

Tag

【单调栈】【暴力枚举】【数组】【2024-03-19】


题目来源

1793. 好子数组的最大分数


解题思路

本题和 84. 柱状图中最大的矩形 一样,计算的都是最大矩形的面积。只不过多了一个约束:矩形必须包含下标 k

以下的方法一和方法二是 84. 柱状图中最大的矩形 的解法。我将在方法二中增加一个判断条件即可解答本题。

方法一:暴力枚举

思路

为了找出柱状图中最大的矩形,我们可以枚举矩形的宽和高。

如果我们枚举「宽」,我们需要用到两层循环来固定矩形的边界,并在矩形的边界中找出最小的高度。这样的操作总的时间复杂度为 O ( n 2 ) O(n^2) O(n2) n n n 为数组 heights 的高度,对于本题 1 0 5 10^5 105 的数据规模,一定超时。

如果我们枚举「高」,需要将数组 heights 中的每一个高度 heights[i] 作为矩形的高,并在这个高度左侧和右侧分别找到 最近的高度小于 heights[i] 的柱子,这两个柱子之间(不包括本身)的所有柱子高度均小于 heights,就是 i 能扩展的最远距离。 这样操作总的时间复杂度为 O ( n 2 ) O(n^2) O(n2),也会超时。

方法二:单调栈

思路

方法二就是将方法一种枚举「高」当中的找到 “最近的高度小于 heights[i] 的柱子” 利用单调栈的方法先计算出来,从来降低时间复杂度。

维护两个数组 leftrightleft[i]right[i] 分别表示柱子 i 左侧且最近的小于其高度的柱子和柱子 i 右侧且最近的小于其高度的柱子。这样以 heighet[i] 为高度的矩形宽度为

r i g h t [ i ] − 1 − ( l e f t [ i ] + 1 ) + 1 = r i g h t [ i ] − l e f t [ i ] − 1 right[i] - 1 - (left[i] + 1) + 1 = right[i] - left[i] - 1 right[i]1(left[i]+1)+1=right[i]left[i]1

首先定义一个单调栈 mono_stack 用来存放柱子在数组中的位置,接着从前往后枚举数组 heights 来更新 left 以及单调栈 mono_stack

  • 将栈顶的元素与当前枚举的元素值 heights[i] 比较,如果栈非空并且栈顶的元素值大于或者等于 heights[i],就出栈,直到栈为空或者找到比 heights[i] 小的栈中元素;
  • 如果栈为空了,说明 heights[i] 左侧没有比它小的元素,更新left[i] = -1;否则就是找到了heights[i] 左侧比它小的元素;
  • 将 nums2[i] 加入栈中。

按照以上操作可以计算出数组 left,同理可以得到 right

最后,依次枚举数组 heights 中的高度,计算以每个高度为矩形的高的最大值。因为题目要求 “好子数组中间必须包含下标 k”,即矩形必须包含下标 k,于是需要增加一条判断:left[i] < k && k < right[i],在该条件成立的情况下,计算矩形的最大面积,即本题的好子数组的最大可能分数。

实现代码

class Solution {
public:int maximumScore(vector<int>& heights, int k) {int n = heights.size();vector<int> left(n), right(n);stack<int> mono_stack;for (int i = 0; i < n; ++i) {while (!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {mono_stack.pop();}left[i] = mono_stack.empty() ? -1 : mono_stack.top();mono_stack.push(i);}mono_stack = stack<int>();for (int i = n-1; i >= 0; --i) {while(!mono_stack.empty() && heights[mono_stack.top()] >= heights[i]) {mono_stack.pop();}right[i] = mono_stack.empty() ? n : mono_stack.top();mono_stack.push(i);}int res = 0;for (int i = 0; i < n; ++i) {if (left[i] < k && k < right[i])res = max(res, (right[i] - left[i] - 1) * heights[i]);}return res;}
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 为数组 heights 的高度。

空间复杂度: O ( n ) O(n) O(n)

写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

PHP+MySQL开发组合:多端多商户DIY商城源码系统 带完整的搭建教程以及安装代码包

近年来&#xff0c;电商行业的迅猛发展&#xff0c;越来越多的商户开始寻求搭建自己的在线商城。然而&#xff0c;传统的商城系统往往功能单一&#xff0c;无法满足商户个性化、多样化的需求。同时&#xff0c;搭建一个功能完善的商城系统需要专业的技术团队和大量的时间成本&a…

基于GEC6818的QT开发之——通过不同按键控制DHT11模块的数据采集与动态显示

基于GEC6818的QT开发之——通过不同按键控制DHT11模块的数据采集与动态显示 使用环境: ubantu16 QT5.7 开发板GEC6818 实现要求&#xff1a; 利用A53按键1、按键2与温湿度传感器完成QT界面动态显示温湿度记录&#xff0c;并指定温湿度记录超过指定范围&#xff0c;进行报警&…

十五、ReentrantLock

synchronized本身是可重入锁 下述示例代码&#xff1a; 当i 2的时候会执行m2的synchronized锁 import java.util.concurrent.TimeUnit;public class T01_ReentrantLock1 {synchronized void m1() {for(int i0; i<10; i) {try {TimeUnit.SECONDS.sleep(1);} catch (Interr…

多模态:Vary-toy

文章目录 前言一、模型结构二、数据工程总结 前言 Vary的提出让大模型在OCR相关任务的能力有了很大突破&#xff0c;通过提出额外的视觉词汇表模块来弥补单一CLIP编码能力的不足&#xff0c;详情可参考我之前的文章——多模态&#xff1a;Vary。 最近Vary的团队开发了一个更小…

UE要收费?难道ue的使用成本要增加吗?

去年&#xff0c;Epic Games在裁员16%后&#xff0c;放出要对非游戏制作等行业使用UE进行收费的消息。3月12日&#xff0c;Epic Games正式宣布了对UE、实时可视化工具Twinmotio和摄影测量应用RealityCapture的新定价。 Epic Games将从下个月开始推出新的Unreal订阅模式&#x…

Vue.js中使用Web Workers来创建一个秒表

在Vue.js中使用Web Workers来创建一个秒表应用可以提高性能&#xff0c;因为Web Workers可以在后台线程中运行&#xff0c;不阻塞主线程。下面是一个简单的Vue.js秒表应用的示例&#xff0c;该应用使用Web Worker来执行计时功能。 首先&#xff0c;我们创建一个Web Worker文件…

python循环结构

循环结构 1.1遍历循环结构for 1.1.1遍历循环for (1)遍历循环for的语句结构: for 循环遍历 in 遍历对象&#xff1a; 语句块 程序执行&#xff1a; &#xff08;2&#xff09;示例&#xff1a; #遍历字符串 for i in hello:print(i) #range()函数&#xff0c;python中的内…

蓝桥杯-Sticks-DFS搜索

题目 样例输出是 6 5 题目中给错了&#xff0c;不知道什么时候会改。 思路 --剪枝&#xff0c;否则时间复杂度和空间复杂度过大&#xff0c;会超时。 --注意有多组测试样例时&#xff0c;需要将bool数组重新赋值为false。 --函数类型不是void&#xff0c;return语句不能省…

【FPGA】摄像头模块OV5640

本篇文章包含的内容 一、OV5640简介1.1 基本概述1.2 工作时序1.2.1 DVP Timing&#xff08;数据传输时序&#xff09;1.2.2 帧曝光工作模式 1.3 OV5640 闪光灯工作模式1.3.1 Xenon Flash&#xff08;氙灯闪烁&#xff09;模式1.3.2 LED 1&2 模式1.3.3 LED 3模式1.3.4 手动开…

Re62:读论文 GPT-2 Language Models are Unsupervised Multitask Learners

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;Language Models are Unsupervised Multitask Learners 论文下载地址&#xff1a;https://cdn.openai.com/better-language-models/language_models_are_unsupervised_multitask_learner…

接口测试开始前做什么?这10步缺一不可!

在进行接口测试之前&#xff0c;测试工程师需要进行一系列的准备工作&#xff0c;以确保测试的顺利进行。以下是接口测试开始之前的准备工作&#xff0c;并附有示例说明&#xff1a; 1. 了解项目和接口文档&#xff1a; 在开始测试之前&#xff0c;测试工程师需要仔细阅读项目…

Android 系统源码快速入门

Android源码快速入门 今天分享的内容是Android源码快速入门&#xff0c;主要分为以下几个步骤&#xff1a; * 硬件要求 * 虚拟机安装 * 开发环境搭建 * 下载编译源码 * 从一个简单的实际开发需求体验 Framework 开发硬件要求 用于 Android Framework 开发的电脑需要较强的 C…

sqlserver列出表的所有字段名

1、纵向列出所有字段 SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME tablename;2、横向列车所有字段&#xff0c;以‘&#xff0c;’分隔 SELECT STUFF((SELECT , column_nameFROM information_schema.columnsWHERE table_name tablenameFOR XM…

使用 Python 编写网络爬虫:从入门到实战

网络爬虫是一种自动化获取网页信息的程序&#xff0c;通常用于数据采集、信息监控等领域。Python 是一种广泛应用于网络爬虫开发的编程语言&#xff0c;具有丰富的库和框架来简化爬虫的编写和执行过程。本文将介绍如何使用 Python 编写网络爬虫&#xff0c;包括基本原理、常用库…

实地研究降本增效的杀伤力,LSTM算法实现全国失业率分析预测

前言 ​ 降本增效降本增笑&#xff1f;增不增效暂且不清楚&#xff0c;但是这段时间大厂的产品频繁出现服务器宕机和产品BUG确实是十分增笑。目前来看降本增效这一理念还会不断渗透到各行各业&#xff0c;不单单只是互联网这块了&#xff0c;那么对于目前就业最为严峻的一段时…

zynq7000 neon 裸机编译

最近想用zynq7000跑下neon&#xff0c;所以就开始折腾。 因为ne10不能用在裸机上&#xff0c;所以盯上了cmsis_dsp。因为这个库可以在cortex-a和cortex-m上面跑&#xff0c;而zynq7000用的是cortex-a9。应该是可以跑的。在这里特别感谢大佬的文章&#xff0c;少走不少弯路。 …

Cinema 4D 2024 for mac/Win:开启三维动画与建模新纪元

在数字化时代&#xff0c;三维动画与建模已成为影视、游戏、广告等多个领域不可或缺的创作工具。而Cinema 4D&#xff0c;作为这一领域的佼佼者&#xff0c;始终以其卓越的性能和创新的功能引领着行业的发展。如今&#xff0c;Cinema 4D 2024的发布&#xff0c;更是为我们带来了…

键盘映射工具KeyTweak的使用,把F9和F10改为 Home、End

如果你的笔记本没有Home、End键 对于写文字和写代码影响还是比较大的 下面使用键盘映射工具KeyTweak 把F9和F10分别改为 Home、End 然后点击ok 电脑重启后 就生效了 很好用 完美解决 小尺寸笔记本 的按键少的烦恼 可以自己再琢磨琢磨 去映射 符合自己需求的按键 软件下载链接&…

【早鸟优惠|高录用|EI稳定检索】2024年虚拟现实、图像和信号处理国际学术会议(ICVISP 2024)诚邀投稿/参会!

【早鸟优惠|高录用|EI稳定检索】 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;ICVISP 2024&#xff09;诚邀投稿/参会&#xff01; # 早鸟优惠 # 先投稿先送审 # #投稿免费参会、口头汇报及海报展示# 2024年虚拟现实、图像和信号处理国际学术会议&#xff08;I…

Golang案例开发之gopacket抓包入门(1)

文章目录 前言一、gopacket是什么&#xff1f;二、gopacket前提二、实践 枚举主机上网络设备的接口1、代码2、结果文档 总结 前言 说起网络抓包&#xff0c;我们一定听过大名鼎鼎的Tcpdump和WireShark。他们分别是Linux平台和Windows平台的抓包工具。 Wireshark抓包工具&…