前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1713. 得到子序列的最少操作次数(最长上升子序DP nlogn)

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

作者头像
Michael阿明
发布2021-02-19 14:41:08
6340
发布2021-02-19 14:41:08
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。

每一次操作中,你可以在 arr 的任意位置插入任一整数。

比方说,如果 arr = 1,4,1,2 ,那么你可以在中间添加 3 得到 1,4,3,1,2 。

你可以在数组最开始或最后面添加整数。

请你返回 最少 操作次数,使得 target 成为 arr 的一个子序列。

一个数组的 子序列 指的是删除原数组的某些元素(可能一个元素都不删除),同时不改变其余元素的相对顺序得到的数组。

比方说,2,7,4 是 4,2,3,7,2,1,4 的子序列(加粗元素),但 2,4,2 不是子序列。

代码语言:javascript
复制
示例 1:
输入:target = [5,1,3], arr = [9,4,2,3,4]
输出:2
解释:你可以添加 5 和 1 ,使得 arr 变为 [5,9,4,1,2,3,4] ,target 为 arr 的子序列。

示例 2:
输入:target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1]
输出:3
 
提示:
1 <= target.length, arr.length <= 10^5
1 <= target[i], arr[i] <= 10^9
target 不包含任何重复元素。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/minimum-operations-to-make-a-subsequence 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

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

  • 建立新的数组 arr_idx,把 arr 中 出现在 target 里的数字,这个数字对应在 target 里的下标存入
  • 然后对 arr_idx 使用 nlogn 的 最长上升子序 DP
  • 注意本题的 互不相同 条件,没有这个条件,以下解法失效
代码语言:javascript
复制
class Solution {
public:
    int minOperations(vector<int>& target, vector<int>& arr) {
        unordered_map<int,int> num_idx;
        for(int i = 0; i < target.size(); ++i)
            num_idx[target[i]] = i;
        vector<int> arr_idx;
        for(auto a : arr)
            if(num_idx.find(a) != num_idx.end())
                arr_idx.push_back(num_idx[a]);//存的idx
                //转化成在 arr_idx 中找最长上升子序列
                
        // 数据量很大,不能用 n^2 解法,需要 nlgn 解法
        vector<int> dp;//存最长上升子序末尾最小的数
        dp.reserve(num_idx.size()+1);//设置容量,避免搬移
        for(int i = 0; i < arr_idx.size(); ++i)
        {
            int cur = arr_idx[i];
            auto pos = lower_bound(dp.begin(),dp.end(),cur);
            if(pos == dp.end())
                dp.push_back(cur);
            else
                *pos = cur;
        }
        return target.size()-dp.size();//最少操作次数
    }
};

784 ms 110.9 MB C++


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/01/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档