热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode1671.得到山形数组的最少删除次数(最长上升子序DPnlogn)

文章目录1.题目2.解题2.1n^2解法2.2nlogn解法1971891,前10.4%4356154,前7.07%前三题如下:Leet


文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 n^2 解法
      • 2.2 nlogn 解法






197 / 1891,前10.4%




435 / 6154,前7.07%

前三题如下:

LeetCode 5557. 最大重复子字符串
LeetCode 5558. 合并两个链表
LeetCode 5560. 设计前中后队列(deque)


1. 题目

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


  • arr.length >= 3
  • 存在某个下标 i (从 0 开始) 满足 0

arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
arr[i] > arr[i &#43; 1] > ... > arr[arr.length - 1]

给你整数数组 nums​ &#xff0c;请你返回将 nums 变成 山形状数组 的​ 最少 删除次数

示例 1&#xff1a;
输入&#xff1a;nums &#61; [1,3,1]
输出&#xff1a;0
解释&#xff1a;数组本身就是山形数组&#xff0c;所以我们不需要删除任何元素。示例 2&#xff1a;
输入&#xff1a;nums &#61; [2,1,1,5,6,2,3,1]
输出&#xff1a;3
解释&#xff1a;一种方法是将下标为 0&#xff0c;15 的元素删除&#xff0c;剩余元素为 [1,5,6,3,1] &#xff0c;是山形数组。示例 3&#xff1a;
输入&#xff1a;nums &#61; [4,3,2,1,1,2,3,1]
输出&#xff1a;4示例 4&#xff1a;
输入&#xff1a;nums &#61; [1,2,3,4,4,3,2,1]
输出&#xff1a;1提示&#xff1a;
3 <&#61; nums.length <&#61; 1000
1 <&#61; nums[i] <&#61; 10^9
题目保证 nums 删除一些元素后一定能得到山形数组。

来源&#xff1a;力扣&#xff08;LeetCode&#xff09;
链接&#xff1a;https://leetcode-cn.com/problems/minimum-number-of-removals-to-make-mountain-array
著作权归领扣网络所有。商业转载请联系官方授权&#xff0c;非商业转载请注明出处。



2. 解题

可以参考&#xff1a;

动态规划应用–最长递增子序列 LeetCode 300


  • 计算每个位置处的最长上升子序长度
  • 正反双向计算2次
  • 然后遍历每个位置&#xff0c;计算 min(n−l1−l2&#43;1)min(n-l1-l2&#43;1)min(nl1l2&#43;1)

2.1 n^2 解法

class Solution {
public:int minimumMountainRemovals(vector<int>& nums) {int n &#61; nums.size();vector<int> dp1(n, 1), dp2(n, 1);for(int i &#61; 1; i < n; &#43;&#43;i){for(int j &#61; i-1; j >&#61; 0; --j){if(nums[j] < nums[i])dp1[i] &#61; max(dp1[i], dp1[j]&#43;1);}}for(int i &#61; n-2; i >&#61; 0; --i){for(int j &#61; i&#43;1; j < n; &#43;&#43;j){if(nums[j] < nums[i])dp2[i] &#61; max(dp2[i], dp2[j]&#43;1);}}int ans &#61; INT_MAX;for(int i &#61; 1; i < n-1; &#43;&#43;i){if(dp1[i]>1 && dp2[i]>1)ans &#61; min(ans, n-(dp1[i]&#43;dp2[i]-1));}return ans;}
};

444 ms 12.2 MB C&#43;&#43;


2.2 nlogn 解法

参考评论区&#xff1a;Zhenghao-Liu

采用了二分查找的方法&#xff0c;直接找到当前数字该插入的位置

直接复制过来Zhenghao-Liu大佬的代码&#xff0c;如下&#xff1a;

const int MAXN&#61;1000;
int l2r[MAXN];
int r2l[MAXN];
const int INF&#61;0x3f3f3f3f;
class Solution {
public:int minimumMountainRemovals(vector<int>& nums) {int size&#61;nums.size();memset(l2r,0x3f,sizeof(l2r));memset(r2l,0x3f,sizeof(r2l));vector<int> vec;vec.reserve(size);for (int i&#61;0;i<size;&#43;&#43;i){int cur&#61;nums.at(i);auto pos&#61;lower_bound(vec.begin(),vec.end(),cur);if (pos&#61;&#61;vec.end())vec.push_back(cur);else*pos&#61;cur;l2r[i]&#61;vec.size();}vec.clear();for (int i&#61;size-1;i>&#61;0;--i){int cur&#61;nums.at(i);auto pos&#61;lower_bound(vec.begin(),vec.end(),cur);if (pos&#61;&#61;vec.end())vec.push_back(cur);else*pos&#61;cur;r2l[i]&#61;vec.size();}int ans&#61;INF;for (int i&#61;1;i<size-1;&#43;&#43;i){int l&#61;l2r[i];int r&#61;r2l[i];if (l>1 && r>1)ans&#61;min(ans,size-(l&#43;r-1));}return ans;}
};

56 ms 11.9 MB C&#43;&#43;



我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号&#xff08;Michael阿明&#xff09;&#xff0c;一起加油、一起学习进步&#xff01;
Michael阿明


推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
author-avatar
镜头拿反的葛小峥给_523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有