当前位置: 首页 > news >正文

【每日一题】得到山形数组的最少删除次数

文章目录

  • Tag
  • 题目来源
  • 解题思路
    • 方法一:最长递增子序列
  • 写在最后

Tag

【最长递增子序列】【数组】【2023-12-22】


题目来源

1671. 得到山形数组的最少删除次数


解题思路

方法一:最长递增子序列

前后缀分解

根据前后缀思想,以 nums[i] 为山顶的山形数组可以看成 nums[i] 左侧以其作为结尾的最长递增子序列,我们记左侧的最长递增子序列的长度为 pre[i],拼接上 nums[i] 右侧以其作为结尾的最长递减子序列,我们记右侧的最长递减子序列的长度为 suf[i],此时以 nums[i] 为山顶的山形数组长度为:
p r e [ i ] + s u f [ i ] − 1 pre[i] + suf[i] - 1 pre[i]+suf[i]1
我们枚举所有的 nums[i],计算所有的最长山顶数组长度 maxLen,最后需要删除的数组元素长度为 n - maxLen 即为最后需要返回的答案。

最长递增子序列

如何计算 presuf

presuf 的计算过程类似。先来看一下 pre 的计算。维护数组 prepre[i] 表示以 nums[i] 作为结尾的最长递增子序列的长度;维护辅助数组 g,表示以当前元素 nums[i] 结尾的最长递增子序列数组。

遍历数组 nums,当前遍历的元素为 nums[i] 记为 x,在数组 g 中使用二分查找找到第一个大于 x 的元素,对应的位置为 it - g.begin() + 1

  • 更新 pre[i] = it - g.begin() + 1
  • 如果 x 不在 g 中,则将 x 加入 g;否则将 x 更新到 g 中相应的位置。

suf 的计算过程中,我们从后往前遍历数组 nums,就是找最长的递增子序列,于是计算过程和 pre 的计算类似。

remark1:因为山峰不可能在数组首和尾两个位置出现,那么在遍历所有山峰的范围 [0, n-1] 时,需要先做判断 pre[i] >= 2 && suf[i] >= 2

remark2:可以先计算 suf,然后一起计算 pre 和更新答案的,留给读者自己实现。

算法

class Solution {
public:int minimumMountainRemovals(vector<int>& nums) {int n = nums.size();vector<int> pre(n), g;for (int i = 0; i < n; ++i) {int x = nums[i];auto it = lower_bound(g.begin(), g.end(), x);pre[i] = it - g.begin() + 1;if (it == g.end()) {g.push_back(x);}else {*it = x;}}vector<int> suf(n);g.clear();for (int i = n - 1; i >= 0; --i) {int x = nums[i];auto it = lower_bound(g.begin(), g.end(), x);suf[i] = it - g.begin() + 1;if (it == g.end()) {g.push_back(x);}else {*it = x;}}int mx = 0;for (int i = 1; i < n - 1; ++i) {mx = max(mx, pre[i] + suf[i] - 1);}return n - mx;}
};

复杂度分析

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),更新 presuf 的时间复杂度都为 O(nlogn),更新答案的时间复杂度为 O ( n ) O(n) O(n)

空间复杂度: O ( n ) O(n) O(n),额外占用的空间为数组 presufg。空间复杂度: O ( n ) O(n) O(n),额外占用的空间为数组 presufg


写在最后

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

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

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

http://www.lryc.cn/news/264899.html

相关文章:

  • 2023年,为什么汽车依然有很多小毛病?
  • yocto系列讲解[实战篇]93 - 添加Qtwebengine和Browser实例
  • Python实验报告十一、自定义类模拟三维向量及其运算
  • 机器学习 | 聚类Clustering 算法
  • IntelliJ IDEA 2023.3 新功能介绍
  • 2. 行为模式 - 命令模式
  • Java智慧工地源码 SAAS智慧工地源码 智慧工地管理可视化平台源码 带移动APP
  • php学习02-php标记风格
  • 13.1 jar文件
  • 论文阅读:Long-Term Visual Simultaneous Localization and Mapping
  • Docker 学习总结(80)—— 轻松驾驭容器,玩转 LazyDocker
  • Android 13 - Media框架(24)- MediaCodecList
  • 【稳定检索|投稿优惠】2024年交通运输与能源动力国际学术会议(IACTEP 2024)
  • React学习计划-React16--React基础(三)收集表单数据、高阶函数柯里化、类的复习
  • 研究生课程 |《数值分析》复习
  • 55 回溯算法解黄金矿工问题
  • [笔记]ByteBuffer垃圾回收
  • c++ opencv中unsigned char *、Mat、Qimage互相转换
  • 法线贴图实现衣服上皱褶特效
  • 2017年第六届数学建模国际赛小美赛B题电子邮件中的笔迹分析解题全过程文档及程序
  • CentOS安装Python解释,CentOS设置python虚拟环境,linux设置python虚拟环境
  • 在线智能防雷监控(检测)系统应用方案
  • flutter + firebase 云消息通知教程 (android-安卓、ios-苹果)
  • 2024年PMP考试新考纲-PMBOK第七版-项目管理原则真题解析
  • vscode开发python环境配置
  • 数据库客户案例:每个物种都需要一个数据库!
  • 数据分析思维导图
  • 网络基础【网线的制作、OSI七层模型、集线器、交换机介绍、路由器的配置】
  • C++中的继承(二)
  • sklearn多项式回归和线性回归