LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)
文章目录
- 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 < 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] ,是山形数组。示例 3:
输入:nums = [4,3,2,1,1,2,3,1]
输出:4示例 4:
输入:nums = [1,2,3,4,4,3,2,1]
输出:1提示:
3 <= nums.length <= 1000
1 <= nums[i] <= 10^9
题目保证 nums 删除一些元素后一定能得到山形数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-number-of-removals-to-make-mountain-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
可以参考:
动态规划应用–最长递增子序列 LeetCode 300
- 计算每个位置处的最长上升子序长度
- 正反双向计算2次
- 然后遍历每个位置,计算 min(n−l1−l2+1)min(n-l1-l2+1)min(n−l1−l2+1)
2.1 n^2 解法
class Solution {public:int minimumMountainRemovals(vector<int>& nums) {int n = nums.size();vector<int> dp1(n, 1), dp2(n, 1);for(int i = 1; i < n; ++i){for(int j = i-1; j >= 0; --j){if(nums[j] < nums[i])dp1[i] = max(dp1[i], dp1[j]+1);}}for(int i = n-2; i >= 0; --i){for(int j = i+1; j < n; ++j){if(nums[j] < nums[i])dp2[i] = max(dp2[i], dp2[j]+1);}}int ans = INT_MAX;for(int i = 1; i < n-1; ++i){if(dp1[i]>1 && dp2[i]>1)ans = min(ans, n-(dp1[i]+dp2[i]-1));}return ans;}
};
444 ms 12.2 MB C++
2.2 nlogn 解法
参考评论区:Zhenghao-Liu
采用了二分查找的方法,直接找到当前数字该插入的位置
直接复制过来Zhenghao-Liu大佬的代码,如下:
const int MAXN=1000;
int l2r[MAXN];
int r2l[MAXN];
const int INF=0x3f3f3f3f;
class Solution {public:int minimumMountainRemovals(vector<int>& nums) {int size=nums.size();memset(l2r,0x3f,sizeof(l2r));memset(r2l,0x3f,sizeof(r2l));vector<int> vec;vec.reserve(size);for (int i=0;i<size;++i){int cur=nums.at(i);auto pos=lower_bound(vec.begin(),vec.end(),cur);if (pos==vec.end())vec.push_back(cur);else*pos=cur;l2r[i]=vec.size();}vec.clear();for (int i=size-1;i>=0;--i){int cur=nums.at(i);auto pos=lower_bound(vec.begin(),vec.end(),cur);if (pos==vec.end())vec.push_back(cur);else*pos=cur;r2l[i]=vec.size();}int ans=INF;for (int i=1;i<size-1;++i){int l=l2r[i];int r=r2l[i];if (l>1 && r>1)ans=min(ans,size-(l+r-1));}return ans;}
};
56 ms 11.9 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)相关推荐
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...
- LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)
1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...
- LeetCode 1653. 使字符串平衡的最少删除次数(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,它仅包含字符 'a' 和 'b' . 你可以删除 s 中任意数目的字符,使得 s 平衡 . 我们称 s 平衡的 当不存在下标 ...
- LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)
文章目录 1. 题目 2. 解题 2.1 暴力超时解 2.2 排序+最长上升子序 463 / 3709,前 12.5% 1240 / 9290,前13.3% 1. 题目 给你 n 个长方体 cuboi ...
- 1558. 得到目标数组的最少函数调用次数 二进制|思维
得到目标数组的最少函数调用次数 给你一个与 nums 大小相同且初始值全为 0 的数组 arr ,请你调用以上函数得到整数数组 nums . 请你返回将 arr 变成 nums 的最少函数调用次数. ...
- LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)
文章目录 1. 题目 2. 解题 1. 题目 假设你是球队的经理.对于即将到来的锦标赛,你想组合一支总体得分最高的球队.球队的得分是球队中所有球员的分数 总和 . 然而,球队中的矛盾会限制球员的发挥, ...
- LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)
文章目录 1. 题目 2. 解题 2.1 回溯 2.2 状态压缩DP 1. 题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] ...
- leetcode 5756. 两个数组最小的异或值之和(状态压缩dp)
题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] XOR nums2[0]) + (nums1[1] XOR nums2[1] ...
- LeetCode 921. 使括号有效的最少添加(栈)
1. 题目 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字 ...
最新文章
- SpringMVC + MyBatis整合 【转】
- Spring Security 实战:使用 JWT 认证访问接口
- 全套CRC校验的算法
- 问懵逼:请站在 JVM 角度谈谈 Java 的锁?
- web 应用在线编辑器 glitch 简介
- 使用Fiddler为满足某些特定格式的网络请求返回mock响应
- 手势相关-解决手势冲突
- 计算机的网络与结构,计算机结构与组成29-网络.ppt
- iphone6s发布会_iPhone 6S/SE升级iOS 13性能测试:App启动速度比iOS 12.4.1慢
- JTable中的MOUSE雙擊事件
- Git学习总结(2)——初识 GitHub
- androidstudio jni开发_高考失利落榜,7年Android开发现已年薪60w,我的逆袭之路想说给你听...
- fatal: “Could not read remote” -- Mac下使用Git Push显示权限错误
- JVM学习03-常用Java虚拟机参数
- Servlet--ListenerFilter
- day002血字的研究
- 2021毓英中学高考成绩查询,泉州知名中学2020高考成绩喜报龙虎榜
- 如何用python制作一张节日贺卡
- 未来计算机图文,毕业图文集 |未来也要笑着走
- Nginx 301重定向域名