LC1713. 得到子序列的最少操作次数(java - 动态规划)

news2024/11/26 10:30:54

LC1713. 得到子序列的最少操作次数

  • 题目描述
    • LIS 动态规划 + 二分法
    • 代码演示

题目描述

难度 - 困难
LC1713.得到子序列的最少操作次数

给你一个数组 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] 不是子序列。

示例 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 不包含任何重复元素。
在这里插入图片描述

LIS 动态规划 + 二分法

为了方便,我们令 target 长度为 n,arr 长度为 m,target 和 arr 的最长公共子序列长度为 max,不难发现最终答案为 n−max。
因此从题面来说,这是一道最长公共子序列问题(LCS)。
但朴素求解 LCS 问题复杂度为 O(n∗m),使用状态定义「f[i][j] 为考虑 a 数组的前 i 个元素和 b 数组的前 j 个元素的最长公共子序列长度为多少」进行求解。
而本题的数据范围为 10^5,使用朴素求解 LCS 的做法必然超时。
一个很显眼的切入点是 target 数组元素各不相同,当 LCS 问题增加某些条件限制之后,会存在一些很有趣的性质。
其中一个经典的性质就是:当其中一个数组元素各不相同时,最长公共子序列问题(LCS)可以转换为最长上升子序列问题(LIS)进行求解。同时最长上升子序列问题(LIS)存在使用「维护单调序列 + 二分」的贪心解法,复杂度为 O(nlog⁡n)。
因此本题可以通过「抽象成 LCS 问题」->「利用 target数组元素各不相同,转换为 LIS 问题」->「使用 LIS 的贪心解法」,做到 O(nlog⁡n) 的复杂度。

朴素的 LIS 问题求解,我们需要定义一个 f[i] 数组代表以 nums[i] 为结尾的最长上升子序列的长度为多少。
对于某个 f[i] 而言,我们需要往回检查 [0,i−1] 区间内,所有可以将 nums[i] 接到后面的位置 jjj,在所有的 f[j]+1中取最大值更新 f[i]。因此朴素的 LIS 问题复杂度是 O(n^2) 的。
LIS 的贪心解法则是维护一个额外 ggg 数组,g[len]=x 代表上升子序列长度为 lenlenlen 的上升子序列的「最小结尾元素」为 x。
整理一下,我们总共有两个数组:

  1. f 动规数组:与朴素 LIS 解法的动规数组含义一致。f[i]f[i]f[i] 代表以 nums[i] 为结尾的上升子序列的最大长度;
  2. g 贪心数组:g[len]=x代表上升子序列长度为 len 的上升子序列的「最小结尾元素」为 x。

由于我们计算 f[i] 时,需要找到满足 nums[j]<nums[i],同时取得最大 f[j] 的位置 j。

我们期望通过 g 数组代替线性遍历。
显然,如果 g 数组具有「单调递增」特性的话,我们可以通过「二分」找到符合 g[idx]<nums[i] 分割点 idxi(下标最大),即利用 O(log⁡n) 复杂度找到最佳转移位置。

代码演示

class Solution {
     public int minOperations(int[] target , int[] arr) {
        Map<Integer, Integer> map = new HashMap();
        int Tlen = target.length, Alen = arr.length;
        //1:target的元素和对应下标 装入map
        for(int i = 0; i < Tlen; i++) 
            map.put(target[i], i);
        
        //2:在arr中寻找相等的值的下标装入下标数组
        int[] index = new int[Alen];
        int p = 0;
        for(int i = 0; i < Alen; i++){
            if(map.containsKey(arr[i])) 
                index[p++] = map.get(arr[i]);
        }
        //3:直接调用处理最长递增公共子串代码(之前做过,这里赋值过来,偷懒)
        int uplen = lengthOfLIS(index,p);
        return Tlen - uplen;
    }
     public int lengthOfLIS(int[] nums,int n){
        if(n == 0) return 0;
        int res = 1;
        int[] dp = new int[n];
        dp[0] = nums[0];
        for(int num:nums){
            int i = 0,j = res;
            while(i < j){
                int mid = (i + j)>>1;
                if(dp[mid] >= num) j = mid;
                else i = mid + 1;
            }
            dp[i] = num;
            if(j == res) res++;
        }
        return res;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql 备份和还原 mysqldump

因window系统为例 在mysql安装目录中的bin目录下 cmd 备份 备份一个数据库 mysqldump -uroot -h hostname -p 数据库名 > 备份的文件名.sql 备份部分表 mysqldump -uroot -h hostname -p 数据库名 [表 [表2…]] > 备份的文件名.sql ## 多个表 空格隔开&#xff0c;中间…

vue使用qrcodejs2生成中心logo二维码

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目场景&#xff1a;老板要求分享页面的二维码增加公司Logo 起初是没Logo的 老板想要的效果 问题描述 提示&#xff1a;这里使用qrcodejs2生成二维码 1.安装 qrcodejs2 npm install qrcodejs2…

[滴水逆向]03-12 pe头字段说明课后作业,输出pe结构

#include <iostream> #include <windows.h> using namespace std; #pragma warning(disable:4996) //DOC结构 typedef struct _DOC_HEADER {WORD e_magic;WORD e_cblp;WORD e_cp;WORD e_crlc;WORD e_cparhar;WORD e_minalloc;WORD e_maxalloc;WORD e_ss;WO…

WebGIS开发教程:切片地图服务和动态地图服务的区别以及加载方式

arcgis发布切片地图服务 arcgis发布动态地图服务 切⽚地图服务和动态地图服务是两种常⻅的Web地图服务类型&#xff0c;它们有以下⼏点区别&#xff1a; 1. 数据格式&#xff1a; 切⽚地图服务是⼀种基于瓦⽚&#xff08;Tile&#xff09;数据的地图服务&#xff0c;地图数据…

IDEA工具debug的小技巧

带条件的断点 满足条件的时候才进入断点&#xff0c;比如下面这个list&#xff0c;怎么设置才能使只有s为"b"的时候才进入断点&#xff1f; 技巧&#xff1a;右键断点&#xff0c;写 s.equals(“b”) 表达式 断点回退 第一次没看清楚上一个断点的数据的时候&…

SpringBoot项目Redis使用

SpringBoot项目Redis使用 引入依赖 <!-- redis --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>对Redis的信息进行配置 redis:database: 0 …

Everything + Cpolar,打造在线搜索的终极神器

文章目录 前言1. 下载安装注册cpolar2. Everything安装和设置2.1 进入Everything官网进行下载2.2 对Everything文件进行设定 3. 创建cpolar内网穿透隧道4. 公网访问测试Everything5. 固定连接公网地址 前言 你还在用Windows资源管理器自带的搜索工具来搜索文件吗&#xff1f;这…

B树的插入和删除

1.B树的插入 1.核心要求 对m阶B树——除根节点外&#xff0c;结点关键字个数 [ m / 2 ] − 1 ≤ n ≤ m − 1 [m/2] -1≤n≤m-1 [m/2]−1≤n≤m−1子树0<关键字1<子树1<关键字2<子树2<… 新元素一定是插入到最底层“终端节点”&#xff0c;用“查找”来确定插…

【Spring Boot 源码学习】OnBeanCondition 详解

Spring Boot 源码学习系列 OnBeanCondition 详解 引言往期内容主要内容1. getOutcomes 方法2. getMatchOutcome 方法2.1 ConditionalOnBean 注解处理2.2 ConditionalOnSingleCandidate 注解处理2.3 ConditionalOnMissingBean 注解处理 3. getMatchingBeans 方法 总结 引言 上篇…

MQ - 15 集群篇_如何构建分布式的消息队列集群(下)

文章目录 导图Pre概述元数据存储服务设计选型基于第三方存储引擎集群内部自实现元数据存储ZooKeeper 的集群构建Kafka 的集群构建基于 ZooKeeper 的集群基于 KRaft 的集群缩容的处理方式总结导图 Pre 接着 MQ - 14 集群篇_如何构建分布式的消息队列集群(上)</

唯品会获得vip商品详情 API 返回值说明(唯品会商品价格销量详情图主图)

item_get-获得vip商品详情 vip.item_get 请求地址 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item…

threejs给3d模型中的物体换肤(修改材质)

变成这样 this.otherModel.traverse(function (child) {if (child instanceof THREE.Mesh && child.name Cylinder240) {// 导入纹理const textureLoader new THREE.TextureLoader();const floorColortextureLoader.load(require(../../../public/img/color.jpg));co…

在Linux中安装nginx-1.20.1+php-7.4.28(增加扩展)

NginxPHP安装在公网IP为x.x.x.x的服务器上 需要下载安装的软件版本&#xff1a;nginx-1.20.1php-7.4.28 需要增加的PHP扩展如下&#xff1a; 在编译安装php-7.4.28时加上的pcntl&#xff1b; 单独下载安装的Wxwork_finance_sdk&#xff1b;&#xff08;在编译安装php-7.4.2…

django和celery的项目,nginx和uwsgi协议,在通过api端口进行deeplearning任务的训练和排队

问题汇总 redis 安装django和celery的安装nginx和uwsgi的安装 一. Django 的项目&#xff0c;有个runserver直接起了一个webserver&#xff0c;为什么还要Nginx包一层&#xff0c;起一个webserver呢&#xff1f; Nginx的性能比Django自带的Webserver的性能要好&#xff0c;pyt…

Jenkins用户管理(二):不同用户分配不同的任务访问权限

需求:不同用户访问到不同的Jenkins任务。 依赖插件:Role-based Authorization Strategy 1. 插件安装 进入【系统管理】-【插件管理】-【可用插件】,搜索Role-based Authorization Strategy进行安装,随后重启jenkins 2. 全局安全配置 进入【系统管理】-【全局安全配置】,【…

引用js文件实现汉字转拼音

先看效果 具体需求是 第一个文本框输入汉字&#xff0c;第三个显示拼音&#xff0c; 先引用js <script src"/js/pinyinutil.js"></script> html这样 <el-input v-model"inputText" style"width:220px" placeholder"请输入…

2023智慧云打印小程序源码多店铺开源版 +前端

智慧自助云打印系统/智慧云打印小程序源码 前端 这是一款全新的基于Thinkphp的最新自助打印系统&#xff0c;最新UI界面设计的云打印小程序源码

前端开发必备:icon封装技巧

main.js import svgIcon from /components/SvgIcon Vue.component(svg-icon-full, svgIcon) const requireAll requireContext > requireContext.keys().map(requireContext) const req require.context(/assets/icons/svg, false, /\.svg$/) // icon位置 requireAll(re…

【运维 Pro】时序场景实践与原理 - 2. 宽表,窄表与 JSON 字段

【运维Pro】: 由 YMatrix 售前和售后团队负责的栏目。除了介绍日常的数据库运维和使用知识&#xff0c;我们更希望能够通过介绍这些知识背后的原理&#xff0c;让大家和我们一起感知数据库的美妙。 摘要 在上一期 《时序场景实践与原理 - 1.分布与分区》中&#xff0c;我们围…

探索智能应用的基石:多模态大模型赋能文档图像处理

目录 0 写在前面1 文档图像分析新重点2 token荒&#xff1a;电子文档助力大模型3 大模型赋能智能文档分析4 文档图像大模型应用可能性4.1 专有大模型4.2 多模态模型4.3 设计思路 总结 0 写在前面 中国智能产业高峰论坛(CIIS2023)旨在为政企研学各界学者专家提供同台交流的机会…