C++单调向量(栈):好子数组的最大分数

作者推荐

利用广度优先或模拟解决米诺骨牌

题目

给你一个整数数组 nums (下标从 0 开始)和一个整数 k 。
一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i+1], …, nums[j]) * (j - i + 1) 。一个 好 子数组的两个端点下标需要满足 i <= k <= j 。
请你返回 好 子数组的最大可能 分数 。
示例 1:
输入:nums = [1,4,3,7,4,5], k = 3
输出:15
解释:最优子数组的左右端点下标是 (1, 5) ,分数为 min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15 。
示例 2:
输入:nums = [5,5,4,5,4,1,1,1], k = 0
输出:20
解释:最优子数组的左右端点下标是 (0, 4) ,分数为 min(5,5,4,5,4) * (4-0+1) = 4 * 5 = 20 。
参数
1 <= nums.length <= 105
1 <= nums[i] <= 2 * 104
0 <= k < nums.length

分析

时间复杂度

O(n)。

步骤

一,寻找nums[i]的右边界,数组边界或从左向右第一个小于nums[i]的数。如果i1小于i2,且nums[i1] <= nums[i2],则i1淘汰了i2,淘汰后:i降序,nums[i]升序。
二,寻找nums[i]的左边界,数组左边界或从右向左,第一个小于nums[i]的数。
三,左开右开区间(vLeft[i],vRight[i]) 就是以nums[i]为最小值的区间。如果k在这个区间,则更新返回值。

代码

核心代码

class Solution {
public:
int maximumScore(vector& nums, int k) {
m_c = nums.size();
vector vRight(m_c, m_c);
{
vector vIndexs;
for (int i = m_c-1 ; i >= 0 ; i-- )
{
while (vIndexs.size() && (nums[vIndexs.back()] >= nums[i]))
{
vIndexs.pop_back();
}
if (vIndexs.size())
{
vRight[i] = vIndexs.back();
}
vIndexs.emplace_back(i);
}
}
vector vLeft(m_c, -1);
{
vector vIndexs;
for (int i = 0; i < m_c; i++)
{
while (vIndexs.size() && (nums[vIndexs.back()] >= nums[i]))
{
vIndexs.pop_back();
}
if (vIndexs.size())
{
vLeft[i] = vIndexs.back();
}
vIndexs.emplace_back(i);
}
}
int iRet = 0;
for (int i = 0; i < m_c; i++)
{
if ((k > vLeft[i]) && (k < vRight[i]))
{
iRet = max(iRet, nums[i] * (vRight[i] - vLeft[i] - 1));
std::cout << i << " nums[i]:" << nums[i] << " " << vLeft[i] << " " << vRight[i] <<std::endl;
}
}
return iRet;
}
int m_c;
};

优化:寻找边界循环一次

左边界数组边界或小于nums[i]
右边界数组边界或小于等于nums[i]

改变规则后:寻找左边界淘汰vIndexs时,说明:i是vIndexs.back()的第一个小于等于的数,也就是右边界。

题外话

解法一会造成重复,本题是求最大值,重复不会影响结果。求和就会有影响了。

比如:{1,1}

解法一解法二
i=0{1,1}{1}
i=1{1,1}{1,1}

拆开后:

解法一:{1},{1},{1,1},{1,1}
解法二:{1},{1,1},{1}

代码

class Solution {
public:
	int maximumScore(vector<int>& nums, int k) {
		m_c = nums.size();
		vector<int> vRight(m_c, m_c);
		vector<int> vLeft(m_c, -1);
		vector<int> vIndexs;
		for (int i = 0; i < m_c; i++)
		{
			while (vIndexs.size() && (nums[vIndexs.back()] >= nums[i]))
			{
				vRight[vIndexs.back()] = i;
				vIndexs.pop_back();
			}
			if (vIndexs.size())
			{
				vLeft[i] = vIndexs.back();
			}
			vIndexs.emplace_back(i);
		}
		int iRet = 0;
		for (int i = 0; i < m_c; i++)
		{
			if ((k > vLeft[i]) && (k < vRight[i]))
			{
				iRet = max(iRet, nums[i] * (vRight[i] - vLeft[i] - 1));
				std::cout << i << " nums[i]:" << nums[i] << " " << vLeft[i]  << " " << vRight[i] <<std::endl;
			}
		}
		return iRet;
	}
	int m_c;
};

2023年3月旧代码

class Solution {
public:
int maximumScore(vector& nums, int k) {
m_c = nums.size();
vector<std::pair<int, int>> staLeft,staRight;
{
for (int i = 0; i < k; i++)
{
while (staLeft.size() && (staLeft.back().first >= nums[i]))
{
staLeft.pop_back();
}
staLeft.emplace_back(nums[i], i);
}
}
{
for (int i = nums.size() - 1; i > k; i–)
{
while (staRight.size() && (staRight.back().first >= nums[i]))
{
staRight.pop_back();
}
staRight.emplace_back(nums[i], i);
}
}
auto CmpFun = [](const std::pair<int, int>& p, int iCmp)
{return p.first < iCmp; };
int iMaxRet = 0 ;
for (int iValue = 1; iValue <= nums[k]; iValue++)
{
auto it = std::lower_bound(staLeft.begin(), staLeft.end(), iValue, CmpFun);
int iLeft = (staLeft.begin() == it) ? -1 : (–it)->second;
auto it2 = std::lower_bound(staRight.begin(), staRight.end(), iValue, CmpFun);
int iRight = (staRight.begin() == it2) ? m_c : (–it2)->second;
iMaxRet = max(iMaxRet, iValue* (iRight - iLeft - 1));
}
return iMaxRet;
}
int m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境:

VS2022 C++17

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

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

相关文章

32+OLED之IIC手撕亚索七级狗牌

成品效果&#xff1a; 硬件配方&#xff1a;STM32F103C8T6 SSD1306 软件配方&#xff1a;字模提取V2.1 CopyLeft By Horse2000 STM32CubeMX keil5 思路&#xff1a; 1.找到图片&#xff0c;将其转化为128*64 像素大小的二值化图片&#xff1b;【python实现转化】&#xff…

配置zabbix-proxy主动式

IP地址对应关系如下&#xff1a; zabbix-server122.9.8.21zabbix-proxy122.9.4.102zabbix-agent2116.63.9.109 一、 安装zabbix-server https://blog.csdn.net/qq_50247813/article/details/132131774 二、 安装zabbix-proxy a. 安装zabbix源 rpm -Uvh https://repo.zabbix…

机器学习笔记 - 基于百度飞桨PaddleSeg的人体分割

一、简述 虽然Segment Anything用于图像分割的通用大模型看起来很酷(飞桨也提供分割一切的模型),但是个人感觉落地应用的时候心里还是更倾向于飞桨这种场景式的,因为需要用到一些人体分割的需求,所以这里主要是对飞桨高性能图像分割开发套件进行了解和使用,但是暂时不训练…

Modbus平台:协议中间件(支持Modbus TCP、RTU、ASCII)

该程序可放置外网中&#xff0c;适用于DTU长连接&#xff08;心跳包必须包含DTU&#xff0c;可以是tcp/udp&#xff09;&#xff0c;也可以在内网中&#xff0c;短连接访问设备server 支持协议&#xff1a;Modbus TCP | RTU | ASCII 连接方式&#xff1a;TcpAtive: TCP主动 | …

机器人制作开源方案 | 智能扶老助残辅助管家

作者&#xff1a;孙运通 黄善越 卢瑀 张宇峰 郑乐怡 单位&#xff1a;河海大学 指导老师&#xff1a;陆其清 人口老龄化始终是我国一个极为严峻的社会问题。独居老人和空巢老人占总人口比重日益提高&#xff1a;预计至2050年老龄人口占比将超20%&#xff0c;绝大部分城市和地…

基于单片机环境监测温湿度PM2.5系统设计

**单片机设计介绍&#xff0c;基于单片机环境监测温湿度PM2.5系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 设计一个基于单片机环境监测温湿度PM2.5的系统是一个非常有意义的项目。以下是一个基本的介绍&#xff1a; …

云原生实战课大纲<2>

我们pod的数据挂载文件可以使用 pv-pvc的方式 1. 创建pv池 2. 在pv池中创建pv&#xff0c;并且设置pv的模式 3. 编写pod 写对应的pvc 申请书 就可以了这就是我们k8s中的pv和pvc 基于pv池创建pv的时候会有容量限制呢么关于配置呢&#xff0c;我们以前会有这种场景 比如说在dock…

Android Studio导入项目一直显示正在下载Gradle项目

如题&#xff0c;问题图类似如下&#xff1a; &#xff08;此图是解决以后截的&#xff0c;之前遇到问题没截图&#xff09; 解决方法 先找到你正在下载的gradle的版本是哪个 然后在链接中 ​​​​​​Gradle Distributions 找到你所对于gradle的版本&#xff0c;下载对应…

Centos7安装配置nginx

快捷查看指令 ctrlf 进行搜索会直接定位到需要的知识点和命令讲解&#xff08;如有不正确的地方欢迎各位小伙伴在评论区提意见&#xff0c;小编会及时修改&#xff09; Centos7安装配置nginx Nginx介绍 Nginx (engine x) 是一个高性能的 HTTP 和 反向代理 服务&#xff0c;也…

Spring Security 6.x 系列(6)—— 显式设置和修改登录态信息

一、前言 此篇是对上篇 Spring Security 6.x 系列&#xff08;5&#xff09;—— Servlet 认证体系结构介绍 中4.9章节显式调用SecurityContextRepository#saveContext进行详解分析。 二、设置和修改登录态 2.1 登录态存储形式 使用Spring Security框架&#xff0c;认证成功…

34 - 记一次线上SQL死锁事故:如何避免死锁?

之前我参与过一个项目&#xff0c;在项目初期&#xff0c;我们是没有将读写表分离的&#xff0c;而是基于一个主库完成读写操作。在业务量逐渐增大的时候&#xff0c;我们偶尔会收到系统的异常报警信息&#xff0c;DBA 通知我们数据库出现了死锁异常。 按理说业务开始是比较简…

业务逻辑漏洞

业务逻辑漏洞 扫描器扫不出来 漏洞包括 暴力破解任意用户/密码登陆短信/邮箱轰炸验证码绕过/爆破/重放/回传用户名/手机号枚举(用户名枚举&#xff1a;当用户登录时&#xff0c;显示用户名不存在&#xff0c;或密码不正确&#xff0c;两个其中一个不正确就称为用户名枚举)越…

MySQL系列 - 数据类型

MySQL是一种常用的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;包括整数、浮点数、字符串、日期和时间等。在本文中&#xff0c;我们将介绍MySQL中常用的数据类型及其用法。 MySQL数据类型介绍&#xff1a; 1、整数类型&#xff1a; MySQL提供了多种整数…

微信小程序 老年人心血管健康知识科普系统

本系统的功能有管理员&#xff1a;个人中心&#xff0c;用户管理&#xff0c;热点信息管理&#xff0c;疾病管理&#xff0c;疾病类型管理&#xff0c;治疗管理&#xff0c;治疗类型管理&#xff0c;护理管理&#xff0c;护理类型管理&#xff0c;科普管理&#xff0c;科普类型…

Elasticsearch 线上实战问题及解决方案探讨

1、reindex相关问题 1.1 问题描述 我有 1tb 的一个大索引若干&#xff0c;要迁移到另外一个新集群去&#xff0c;有没有好办法&#xff1f;reindex好像会中断...... reindex 是不是就算设置了频率也会莫名的中断&#xff0c;而且没地方查到错误&#xff1f;1000多万的数据&…

『 Linux 』进程优先级

文章目录 什么是优先级Linux下的进程优先级PRI与NI使用top查看进程以及对进程的优先级的修改 进程优先级的其他概念竞争性与独立性并发与并行 什么是优先级 优先级,顾名思义,即在同一环境下不同单位对同一个资源的享有顺序; 一般优先级高的单位将优先占有该资源; 在进程当中进…

海翔云平台 getylist_login.do SQL 注入漏洞复现

0x01 产品简介 海翔云平台一站式整体解决方案提供商&#xff0c;业务涵盖 批发、连锁、零售行业ERP解决方案、wms仓储解决方案、电商、外勤、移动终端&#xff08;PDA、APP、小程序&#xff09;解决方案。 0x02 漏洞概述 海翔云平台getylist_login.do接口处存在SQL注入漏洞&am…

wmvcore.dll丢失怎么办?解决电脑出现wmvcore.dll丢失问题5个方法

wmvcore.dll缺失5个解决方法与wmvcore.dll丢失原因及文件介绍 引言&#xff1a; 在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是wmvcore.dll缺失。wmvcore.dll是Windows Media Video编码解码相关动态链接库文件之一&#xff0c;它对…

vue3 element plus 表单验证 数组嵌套对象格式验证 动态验证等

基本结构 model 表单数据对象 rules 验证对象 prop model 的键名 <template><el-form ref"ruleFormRef" :model"ruleForm" :rules"rules"><el-form-item label"手机号" prop"mobile"><el-input v-mod…

使用opencv实现更换证件照背景颜色

1 概述 生活中经常要用到各种要求的证件照电子版&#xff0c;红底&#xff0c;蓝底&#xff0c;白底等&#xff0c;大部分情况我们只有其中一种&#xff0c;本文通过opencv实现证件照背景的颜色替换。 1.1 opencv介绍 OpenCV&#xff08;Open Source Computer Vision Librar…