文章目录

  • 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)相关推荐

  1. LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...

  2. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

    1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...

  3. LeetCode 1653. 使字符串平衡的最少删除次数(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,它仅包含字符 'a' 和 'b'​​​​ . 你可以删除 s 中任意数目的字符,使得 s 平衡 . 我们称 s 平衡的 当不存在下标 ...

  4. LeetCode 1691. 堆叠长方体的最大高度(排序+最大上升子序DP)

    文章目录 1. 题目 2. 解题 2.1 暴力超时解 2.2 排序+最长上升子序 463 / 3709,前 12.5% 1240 / 9290,前13.3% 1. 题目 给你 n 个长方体 cuboi ...

  5. 1558. 得到目标数组的最少函数调用次数 二进制|思维

    得到目标数组的最少函数调用次数 给你一个与 nums 大小相同且初始值全为 0 的数组 arr ,请你调用以上函数得到整数数组 nums . 请你返回将 arr 变成 nums 的最少函数调用次数. ...

  6. LeetCode 1626. 无矛盾的最佳球队(最大上升子序DP)

    文章目录 1. 题目 2. 解题 1. 题目 假设你是球队的经理.对于即将到来的锦标赛,你想组合一支总体得分最高的球队.球队的得分是球队中所有球员的分数 总和 . 然而,球队中的矛盾会限制球员的发挥, ...

  7. LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 回溯 2.2 状态压缩DP 1. 题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] ...

  8. leetcode 5756. 两个数组最小的异或值之和(状态压缩dp)

    题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] XOR nums2[0]) + (nums1[1] XOR nums2[1] ...

  9. LeetCode 921. 使括号有效的最少添加(栈)

    1. 题目 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字 ...

最新文章

  1. SpringMVC + MyBatis整合 【转】
  2. Spring Security 实战:使用 JWT 认证访问接口
  3. 全套CRC校验的算法
  4. 问懵逼:请站在 JVM 角度谈谈 Java 的锁?
  5. web 应用在线编辑器 glitch 简介
  6. 使用Fiddler为满足某些特定格式的网络请求返回mock响应
  7. 手势相关-解决手势冲突
  8. 计算机的网络与结构,计算机结构与组成29-网络.ppt
  9. iphone6s发布会_iPhone 6S/SE升级iOS 13性能测试:App启动速度比iOS 12.4.1慢
  10. JTable中的MOUSE雙擊事件
  11. Git学习总结(2)——初识 GitHub
  12. androidstudio jni开发_高考失利落榜,7年Android开发现已年薪60w,我的逆袭之路想说给你听...
  13. fatal: “Could not read remote” -- Mac下使用Git Push显示权限错误
  14. JVM学习03-常用Java虚拟机参数
  15. Servlet--ListenerFilter
  16. day002血字的研究
  17. 2021毓英中学高考成绩查询,泉州知名中学2020高考成绩喜报龙虎榜
  18. 如何用python制作一张节日贺卡
  19. 未来计算机图文,毕业图文集 |未来也要笑着走
  20. Nginx 301重定向域名

热门文章

  1. Azkaban简介及安装教程
  2. 为什么NX10帮助功能无法找到HTML,NX10.0 新功能介绍视频教程专辑
  3. Linux进程全解8——exec 族函数
  4. CS224n笔记3 高级词向量表示
  5. margin 负边距应用
  6. json字符串与json对象之间的转换
  7. struts2中一些常用的写法 记录
  8. 字符串数组判断数字,字母汉字,
  9. 第三次作业:PSP耗时
  10. 嵌入式工程师薪资调查