Leetcode1713. 得到子序列的最少操作次数[C++题解]:LCS转化成LIS,转化为nlogn做法
文章目录
- 本题分析
- 题目链接
本题分析
本题难在问题转换上。
【问题转化1】转化为求两个序列最长公共子序列(LCS)的长度。 然后target 的长度减去 公共子序列的长度,就是答案。
本题数据规模是10510^5105,普通求LCS的算法O(n2)O(n^2)O(n2)肯定TLE,只能想O(nlogn)的解法。
题目给的数组target元素不重复,这样如果arr数组和target数组存在公共子序列的话,那么arr中这些元素在target中出现的下标是严格递增的!!!
比如下面的样例
输入:target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1]
输出:3
下面我们对arr数组中的元素在target中出现的位置进行标记:
arr数组 | 4 | 7 | 6 | 2 | 3 | 8 | 6 | 1 |
---|---|---|---|---|---|---|---|---|
在target中的下标 | 1 | no | 0 | 5 | 4 | 2 | 0 | 3 |
其中1个最长公共子序列LCS:{ 6 8 1} ,请看 arr中这3个元素在target数组中的位置,下标分别是 0, 2,3,有严格的递增关系。
反过来,如果arr数组中的元素对应在target中的下标,存在严格递增关系,那么这些arr中的数也必然构成两个数组的公共子序列。比如上表中下标是 2,3 递增,那么对应的元素是{8 1} 就是一个公共子序列。
【问题转化2】问题转换为arr转换后的数组(转换成target中的下标)后的最长上升子序列(LIS)!!! 而LIS问题存在O(nlogn)的解法。
ac代码
class Solution {public:int minOperations(vector<int>& target, vector<int>& arr) {int n=target.size();unordered_map<int,int> pos;//哈希表<元素, 下标>for(int i=0;i<n;i++){pos[target[i]]=i; //target数组中每个元素的下标}vector<int > a; //保存arr数组元素的下标for(auto x: arr){if(pos.count(x)) //如果arr中的元素在target中出现过a.push_back(pos[x]); //出现过,存下标}//下求a数组的最长上升子序列的长度:即为target和arr数组的公共子序列的长度vector<int > vec;for(int i=0;i<a.size();i++){int p=lower_bound(vec.begin(),vec.end(),a[i])-vec.begin();if(p==vec.size()) vec.push_back(a[i]);else vec[p]=a[i];}return n-vec.size(); //返回target的长度-公共子序列的长度}
};
题目链接
Leetcode1713. 得到子序列的最少操作次数
Leetcode1713. 得到子序列的最少操作次数[C++题解]:LCS转化成LIS,转化为nlogn做法相关推荐
- 1713. 得到子序列的最少操作次数
给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任意位置插入任一整数.比方说,如果 arr = ...
- LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)
文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素. 每一次操作中,你可以在 arr 的任 ...
- leedcode04:转换字符串的最少操作次数
一:题目 给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O' . 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 'O' .注意,如果字符已经是 ...
- 2027. 转换字符串的最少操作次数
2027. 转换字符串的最少操作次数 给你一个字符串 s ,由 n 个字符组成,每个字符不是 'X' 就是 'O' . 一次 操作 定义为从 s 中选出 三个连续字符 并将选中的每个字符都转换为 'O ...
- LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)
文章目录 1. 题目 2. 解题 1. 题目 给你两个长度可能不等的整数数组 nums1 和 nums2 . 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6). 每次操作中,你可以选择 任 ...
- LeetCode 1674. 使数组互补的最少操作次数(差分思想)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 偶数 n 的整数数组 nums 和一个整数 limit . 每一次操作,你可以将 nums 中的任何整数替换为 1 到 limit 之间的 ...
- 最少操作次数(英雄会)
作者博客链接 题目详情: 给定两个字符串,仅由小写字母组成,它们包含了相同字符. 求把第一个字符串变成第二个字符串的最小操作次数,且每次操作只能对第一个字符串中的某个字符移动到此字符串中的开头. 例如 ...
- LeetCode 2208. 将数组和减半的最少操作次数(优先队列)
文章目录 1. 题目 2. 解题 1. 题目 给你一个正整数数组 nums .每一次操作中,你可以从 nums 中选择 任意 一个数并将它减小到 恰好 一半.(注意,在后续操作中你可以对减半过的数继续 ...
- LeetCode 1312. 让字符串成为回文串的最少插入次数(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符. 请你返回让 s 成为回文串的 最少操作次数 . 「回文串」是正读和反读都相同的字 ...
最新文章
- 线性回归——lasso回归和岭回归(ridge regression)
- 报表-对于多数据进行 分sheet以及 分workbook处理
- JSON 对象和字符串对象的互转
- Python超详细的字符串用法大全
- 文件操作-小文件复制
- 14.深度学习练习:Face Recognition for the Happy House
- 招博后,比利时鲁汶大学 A2H 部计算机视觉动物行为分析方向
- 补习系列(16)-springboot mongodb 数据库应用技巧
- request payload怎么发_如果不是你,我也不会发朋友圈
- 【图像分割】基于matlab GUI二值化+灰白质医学影像分割【含Matlab源码 184期】
- CHD 常用web端口
- php bi报表,PowerBI开发 报表设计技巧
- 【R语言】如何进行英文分词统计(以《爱丽丝漫游奇境》词频统计为例)(20年3月22日复习笔记)
- 使用OpenSER构建电话通信系统——第一章(2)
- 怎么样成为java架构师_java架构师工资一般多少?怎样成为架构师?
- php使用vs,使用vs code写php及调试
- hive的环境搭建,以及简单使用-01
- 我用wxPython搭建GUI量化系统之财务选股工具剔除ST股和次新股
- web前端作业--响应式蛋糕店网页设计(HTML+CSS+JavaScript)
- 厂房规划物流仿真之sketchUP(SU)