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

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

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

相关文章

【LangChain实战】LangChain快速入门

1、什么是大语言模型 大语言模型是一种人工智能模型&#xff0c;通常使用深度学习技术&#xff0c;比如神经网络&#xff0c;来理解和生成人类语言。这些模型的“大”在于它们的参数数量非常多&#xff0c;可以达到数十亿甚至更多&#xff0c;这使得它们能够理解和生成高度复杂…

【Vue3】

组合式API setup选项 执行时机&#xff1a;比beforeCreate早 不能使用this 数据和函数需要return才能应用 标准写法 <script>export default {setup() {const message "vue32"const logMessage () > {console.log(message)}return {message,logMess…

MATLAB算法实战应用案例精讲-【图像处理】机器人视觉

目录 前言 机器人视觉发展历程 知识储备 光的偏振 01偏振光 02偏振应用

PostgreSQL数据库中的后台进程

在 PostgreSQL 中&#xff0c;有多个后台进程&#xff08;也称为工作者进程&#xff09;&#xff0c;负责处理不同的任务和功能。这些进程包括但不限于以下几种&#xff1a; 1. PostgreSQL数据库中的后台进程 1.1. Postmaster 进程 这是 PostgreSQL 服务器的主进程&#xff…

livox 半固体激光雷达 gazebo 仿真 | 更换环境与雷达型号

livox 半固体激光雷达 gazebo 仿真 | 更换环境与雷达型号 livox 半固体激光雷达 gazebo 仿真 | 更换环境与雷达型号livox 介绍更换环境更换livox激光雷达型号 livox 半固体激光雷达 gazebo 仿真 | 更换环境与雷达型号 livox 介绍 览沃科技有限公司&#xff08;Livox&#xff…

【动态规划】求最长递增子序列问题

目录 问题描述递推关系建立递推关系的思路约束条件:以 s [ k ] s[k] s[k] 结尾约束条件:以 s [ k ] s[k] s[k] 开头约束条件:增加子问题参数&#xff08;前缀&#xff09;约束条件:增加子问题参数&#xff08;后缀&#xff09;约束条件:LIS长度为k且末尾元素最小 运行实例 问…

将图像的rgb数据转成DICOM医学图像格式

dcmtk官方文档&#xff1a;https://support.dcmtk.org/docs/ dcmtk最新源码下载&#xff1a;https://www.dcmtk.org/en/dcmtk/dcmtk-software-development/ dcmtk旧版本源码下载&#xff1a;https://dicom.offis.de/download/dcmtk/ 用DCMTK库实现将图像转成dcm格式 dcmtk库的…

linux logrotate日志轮询设置案例一

1.编辑/etc/logrotate.conf文件&#xff0c;添加如下配置&#xff0c;并保存 /var/log/ztj.log {missingokhourlycreate 644 root rootsharedscriptspostrotateif [ -f /var/run/syslogd.pid ];then/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) >/dev/null 2>&…

C++二分查找、离线算法:最近的房间

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 一个酒店里有 n 个房间&#xff0c;这些房间用二维整数数组 rooms 表示&#xff0c;其中 rooms[i] [roomIdi, sizei] 表示有一个房间号为 roomIdi 的房间且它的面积为 sizei 。每一…

mitmproxy安装以及模拟接口数据返回

使用pycharm直接安装&#xff0c;pip install mitmproxy 安装成功后直接使用命令mitmdump --version查看版本 然后自己本地下载https://mitmproxy.org/downloads/#10.1.1/ 之后一步步安装即可 安装成功后这里会出现一个.mitmproxy文件 双击这个文件进入开始安装证书 我…

Python与设计模式--迭代器模式

23种计模式之 前言 &#xff08;5&#xff09;单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、&#xff08;11&#xff09;策略模式、责任链模式、命令模式、中介者模…

明亮暖色人像

明亮暖色人像 1、Lr 曝光up&#xff0c;提高明亮度黑色色调up & 对比度down & 反差down --> 柔和度up色温up&#xff0c;暖色调up [10] 。----->暖色增强 However 人物皮肤黄up ----->HSL控制肤色---->饱和度&#xff08;橙色down、黄色up&#xff09;—…

【闲读 1】量子论引出对认知的思考

文章目录 一、物理学的两朵乌云故事量子力学的世界 二、 波粒二象性三、量子不确定性四、感知尺度 混沌学院课程《【物理学思维】第四节 量子论》&#xff0c;观后感。 一、物理学的两朵乌云故事 19世纪末&#xff0c;著名的物理学家开尔文爵士&#xff08;温度单位命民&…

vue2通过权限控制tab标签显示和隐藏

vue2通过权限控制tab标签显示和隐藏 1、前言2、v-if实现自定义控制 1、前言 在开发过程中&#xff0c;我们可能会遇到这样一个场景&#xff1a;根据不同权限对tab栏内容进行控制&#xff0c;这时候用自定义指令v-permission就达不到我们想要的效果&#xff0c;其是将当前节点的…

图书管理系统源码,图书管理系统开发,图书借阅系统源码整体功能演示

用户登录 基础资料 操作员管理 超期罚金设置 读者分类 读者管理 图书分类 图书管理 图书借还管理 图书借取 图书还去 图书借还查询 读者借书排行 用户登录 运行View目录下Login文件夹下的Index.csthml出现登录界面&#xff0c;输入用户名密码分别是admin密码admin12…

IDEA删除的文件怎么找回更新

一、 查找本地历史记录IDEA在进行代码版本管理时&#xff0c;会自动创建本地历史记录&#xff0c;如果我们误删了文件&#xff0c;可以通过查找本地历史记录来找回文件。 1.在项目中&#xff0c;选中被删文件的父级目录&#xff0c;“File”->“Local History”->“Show…

Realtek蓝牙Android10.0移植结束后的基本测试和常见问题分析

基本测试主要包括配置检查和BT测试两大部分 配置检查&#xff1a; 为了进一步确保 porting 没有问题&#xff0c;在测试之前先确认 fw 以及 config 文件是否存在。 adb shell 到测试平台的根目录&#xff0c;检查测试平台的 vendor/firmware/目录中 rtlxxxx_fw 以及 rtlxxx…

智能优化算法应用:基于头脑风暴算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于头脑风暴算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于头脑风暴算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.头脑风暴算法4.实验参数设定5.算法结果6.参考…

Linux:文件系统初步理解

文章目录 文件的初步理解C语言中对文件的接口系统调用的接口位图的理解open调用接口 文件和进程的关系进程和文件的低耦合 如何理解一切皆文件&#xff1f; 本篇总结的是关于Linux中文件的各种知识 文件的初步理解 在前面的文章中有两个观点&#xff0c;1. 文件 内容 属性&…

19 Go的时间日期

概述 在上一节的内容中&#xff0c;我们介绍了Go的Gob&#xff0c;包括&#xff1a;Gob简介、Gob编码、Gob解码等。在本节中&#xff0c;我们将介绍Go的时间日期。Go语言提供了一套强大的时间日期处理库&#xff0c;使得处理时间和日期变得简单和高效。Go语言中处理日期和时间的…