【动态规划-最长递增子序列(LIS)】【hard】力扣1671. 得到山形数组的最少删除次数

我们定义 arr 是 山形数组 当且仅当它满足:

arr.length >= 3
存在某个下标 i (从 0 开始) 满足 0 < i < arr.length - 1 且:
arr[0] < arr[1] < … < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > … > arr[arr.length - 1]
给你整数数组 nums​ ,请你返回将 nums 变成 山形状数组 的​ 最少 删除次数。

示例 1:
输入:nums = [1,3,1]
输出:0
解释:数组本身就是山形数组,所以我们不需要删除任何元素。

示例 2:
输入:nums = [2,1,1,5,6,2,3,1]
输出:3
解释:一种方法是将下标为 0,1 和 5 的元素删除,剩余元素为 [1,5,6,3,1] ,是山形数组。

在这里插入图片描述

二分查找

class Solution {
public:int minimumMountainRemovals(vector<int>& nums) {int n = nums.size();vector<int> lis(n, 1), lds(n, 1);vector<int> inc; for (int i = 0; i < n; ++i) {auto it = lower_bound(inc.begin(), inc.end(), nums[i]);if (it == inc.end()) {inc.push_back(nums[i]);} else {*it = nums[i];}lis[i] = inc.size();}vector<int> dec; // 计算从右到左的最长递减子序列 (LDS) 长度,使用二分查找for (int i = n - 1; i >= 0; --i) {auto it = lower_bound(dec.begin(), dec.end(), nums[i]);if (it == dec.end()) {dec.push_back(nums[i]);} else {*it = nums[i];}lds[i] = dec.size();}int minRemovals = n;for (int i = 1; i < n - 1; ++i) {if (lis[i] > 1 && lds[i] > 1) {// 山峰的长度是 lis[i] + lds[i] - 1minRemovals = min(minRemovals, n - (lis[i] + lds[i] - 1));}}return minRemovals;}
};

时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。

空间复杂度:O(n)。

这道题的思路就是构建一个最长递增子序列LIS和最长递减子序列LDS。
开始,我们定义vector<int> lis(n, 1), lds(n, 1);来储存以nums[i]结尾的最长递增/递减子序列长度。

我们定义一个迭代器it,指向通过二分查找找到的inc数组中的大于等于nums[i]的元素。
需要注意是
由于 upper_bound 查找的是严格大于当前值的元素,它确保了序列是非严格递增的,即允许相同的元素出现在序列中。例如,如果当前序列为 1, 2, 3,新加入的元素也是 3,upper_bound 会找到序列末尾并在适当位置插入新的 3,从而维持非严格递增的性质。

而lower_bound查找的是大于等于nums[i]的元素,所以nums[i]如果有与inc中相等的元素,会替换而不是推入,这保证了最长递增子序列是严格递增的。

我们还定义了lis和lds来储存不同nums[i]结尾的最长递增。递减子序列的长度。我们遍历每个元素结尾的最长递增子序列和最长递减子序列的长度。·然后通过minRemovals来记录山峰数组的最少删除次数。

最后返回minRemovals。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

掌握甘特图,没有Excel也能轻松制作的技巧

甘特图是项目管理中常用工具&#xff0c;由亨利甘特发明。不擅长Excel者可用ZohoProjects等软件创建甘特图&#xff0c;其直观展示项目时间和任务&#xff0c;支持实时协作、工时管理等功能&#xff0c;广泛应用于各领域项目管理。 一、甘特图的由来 甘特图最初是由工程师和管…

tp5 fastadmin列表页图片批量压缩并下载

记录&#xff1a;tp5 fastadmin对列表页选中数据的多张图片进行压缩并下载。 html代码 <a href"javascript:;" class"btn btn-info btn-apple btn-disabled disabled {:$auth->check(zhuanli/zhuanli/xiazai)?:hide}" title"批量下载专利证书…

selenium-Alert类用于操作提示框/确认弹框(4)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.alert()可以返回Alert对象&#xff0c;而Alert对象主要用于网页中弹出的提示框/确认框/文本输入框的确认或者取消等动作。 Alert介绍 当在页面定位到提示框/确认框/文本录入…

如何通过systemed实现Linux脚本在服务器的开机自启动,解决网络摄像机IPC通过 域名接入视频监控平台出现离线的问题。

目录 一.问题描述和分析 二.实现脚本开机自启动的过程 2.1确认该系统是不是systemed系统 2.2创建并配置该脚本的systemd服务 2.2.1创建服务 2.2.2配置服务 2.3启动服务 三.问题解决结果 3.1查看服务状态 3.2查看摄像机在线状态 3.3查看视频是否正常 一.问题描述和分…

leetcode:反转字符串中的单词III

题目链接 string reverse(string s1) {string s2;string::reverse_iterator rit s1.rbegin();while (rit ! s1.rend()){s2 *rit;rit;}return s2; } class Solution { public:string reverseWords(string s) {string s1; int i 0; int j 0; int length s.length(); for (i …

C++关于树的基础知识

首先区分概念 “度为m的树”指的是至少有一个结点的度是m&#xff0c;一定是非空树 “m叉树”指的是允许所有的结点都小于m&#xff0c;且可以是空树 常见考点&#xff1a; 度为m的树的第i层最多有个结点 &#xff08;对于m叉树也相同&#xff09; 第一层m的0次方 第二层m的…

电池大师 2.3.9 | 专业电池管理,延长寿命优化性能

Battery Guru 显示电池使用情况信息&#xff0c;测量电池容量&#xff08;mAh&#xff09;&#xff0c;并通过有用技巧帮助用户改变充电习惯&#xff0c;延长电池寿命。支持显示电池健康状况&#xff0c;优化电池性能。 大小&#xff1a;9.6M 百度网盘&#xff1a;https://pan…

多模态大语言模型(MLLM)-InstructBlip深度解读

前言 InstructBlip可以理解为Blip2的升级版&#xff0c;重点加强了图文对话的能力。 模型结构和Blip2没差别&#xff0c;主要在数据集收集、数据集配比、指令微调等方面下文章。 创新点 数据集收集&#xff1a; 将26个公开数据集转换为指令微调格式&#xff0c;并将它们归类…

创建osd加入集群

故障原因&#xff1a;ceph节点一个磁盘损坏&#xff0c;其中osd69 down了&#xff0c;需要更换磁盘并重新创建osd加入ceph集群。 信息采集&#xff1a; 更换磁盘前&#xff0c;查询osd69对应的盘符&#xff1a; 将对应的故障磁盘更换后&#xff0c;并重做raid&#xff0c;然后查…

≌图概念凸显有长度不同的射线

黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线、无人能知有互不≌的射线&#xff0c;从而使数学一直有几何“常识”&#xff1a;任何射线都没有长度差别。保距变换和≌图概念使人能一下子看到有长度不同的射线。 变量x所取各数也均由x代表&#xff0c…

1. Keepalived概念和作用

1.keepalived概念 (1)解决单点故障(组件免费) (2)可以实现高可用HA机制 (3)基于VRR协议(虚拟路由沉余协议) 2.keepalived双机主备原理

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架&#xff0c;已有多家游戏厂商在生产环境使用&#xff0c;官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力&#xff0c;但是UOS目前不支持自建的Dedicated servers 集群&#x…

ai论文写作软件哪个好?分享5款ai论文题目生成器

在当前的学术研究和写作领域&#xff0c;AI论文写作软件已经成为提高效率和质量的重要工具。根据多个来源的评测和推荐&#xff0c;以下是五款值得推荐的AI论文写作软件&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…

【第2章 开始学习C++】C++语句

文章目录 导语声明语句和变量赋值语句cout的新花样使用cin类简介 导语 C 程序是一组函数&#xff0c; 而每个函数又是一组语句。 C 有好几种语句&#xff0c;例如&#xff1a;声明语句创建变量&#xff0c; 赋值语句给该变量提供一个值。 声明语句和变量 计算机是一种精确的…

HCIA——one

推荐电影&#xff1a;《模仿游戏》《黑客帝国》《头号玩家》 图灵机每秒五千次计算&#xff0c;当今计算机4080ti算力每秒21万亿次的计算。 OSI七层模型 应用层&#xff1a;人机交互&#xff0c;将抽象语言转换成编码 表示层&#xff1a;将编码转换成二进制 介质访问控制层…

Chatgpt 原理解构

一、背景知识 1. 自然语言处理的发展历程 自然语言处理在不同时期呈现出不同的特点和发展态势。萌芽期&#xff0c;艾伦・图灵在 1936 年提出 “图灵机” 概念&#xff0c;为计算机诞生奠定基础&#xff0c;1950 年他提出著名的 “图灵测试”&#xff0c;预见了计算机处理自然…

国内经典多模态大模型工作1——Qwen-VL系列(Qwen-VL、Qwen2-VL解读)

Qwen-VL 论文标题&#xff1a;《Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond》 论文链接&#xff1a;https://arxiv.org/pdf/2308.12966.pdf 项目&#xff1a;https://github.com/QwenLM/Qwen-VL/tree/master 模…

DAMA数据管理知识体系(第13章 数据质量)

课本内容 13.1 引言 语境图 图13-1 语境关系图&#xff1a;数据质量业务驱动因素 1&#xff09;提高组织数据价值和数据利用的机会。2&#xff09;降低低质量数据导致的风险和成本。3&#xff09;提高组织效率和生产力。4&#xff09;保护和提高组织的声誉。 提机会、降成本、增…

3D看车如何实现?有哪些功能特点和优势?

3D看车是一种创新的汽车展示方式&#xff0c;它利用三维建模和虚拟现实技术&#xff0c;将汽车以更真实、更立体的形式呈现在消费者面前。 一、3D看车的实现方式 1、三维建模&#xff1a; 通过三维建模技术&#xff0c;按照1:1的比例还原汽车外观&#xff0c;包括车身线条、细…

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】

yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察&#xff0c;仅仅通过这…