【动态规划】子序列问题II|最长定差子序列|最长的斐波那契数列的长度|最长等差数列|等差数列的划分

一、最长定差子序列

1218. 最长定差子序列

算法原理:

💡细节:

1.正常创建dp表,分析状态转移方程:可能b存在于多个不同的位置,那么要用哪个下标的dp呢?

用最后一个b的,因为用前面的可能后面还存在c可以满足条件(a-b=b-c)

2.优化1:那么多b值,那么普通查找只能从后面开始一个一个找,为了提高效率,可以将b+dp[j]的值放入哈希表中

3.优化2:既然都将dp值放入哈希表中,那么可以直接不用new一个dp表,直接在哈希表中做动态规划,这样也同样有下标对应,只是由数组变为哈希表(k,v)

4.初始化为最小值

class Solution {public int longestSubsequence(int[] arr, int difference) {Map<Integer,Integer> hash = new HashMap<>();//分别放arr[i],dp[i]int ret = 1;for(int a:arr) {hash.put(a,hash.getOrDefault(a-difference,0)+1);ret = Math.max(ret,hash.get(a));}return ret;}
}

 二、最长的斐波那契数列的长度

873. 最长的斐波那契子序列的长度

算法原理:

💡细节: 

1.如果只用一维数组表示dp,肯定是表示不出来的,当一维dp去找前一个数字nums[j]的时候,由于dp表示的是这个位置结尾的最长长度,并不知道倒数第二个斐波那契数的位置,所以需要多一个参数表示

2.优化:通过b,c去找a的时候,需要遍历数组,为了提高效率,将下标和对应的元素放入哈希表中

3.初始化:虽然可能结果为0,但是直接初始化为2,可以少考虑状态转移方程两种情况,同时这样处理要注意返回值处理

class Solution {public int lenLongestFibSubseq(int[] arr) {//哈希表优化Map<Integer,Integer> hash = new HashMap<>();int n = arr.length;for(int i=0;i<n;i++) hash.put(arr[i],i);int[][] dp = new int[n][n];//初始化for(int i=0;i<n;i++) for(int j=0;j<n;j++) dp[i][j] = 2;int ret =2;for(int j=2;j<n;j++) {//最后一个数得从第3个位置开始for(int i=1;i<n;i++) {//倒数第二个数得从第2个位置开始int a = arr[j]-arr[i];//第一个数的大小if(a<arr[i]&&hash.containsKey(a)) {dp[i][j] = dp[hash.get(a)][i] + 1;}ret = Math.max(ret,dp[i][j]);}}return ret<3?0:ret;}
}

三、最长等差数列

1027. 最长等差数列

算法原理:

 💡细节: 

1.同上题一样,一维dp数组只能知道长度,不知道等差数列啥样,所以需要多开一个参数,用两个数来确定第一个数的位置

2.状态转移方程的确定:分三种情况,第一个数a是否存在+a存在是否在b(第二个数)的左边

(1)a存在&&a在b的左边 ->dp[i][j] = dp[k][i] +1(其中k为第一个数的下标,需要在数组中找)

(2)a存在but a在b的右边-> dp = 2(由于dp的设置,只要两个不同的值i和j)

(3)a不存在 -> dp = 2

3.遍历优化:找k下标的方式O(n**3)优化

(1)第一种优化方式:在dp之前,将<元素,下标数组>放入哈希表中->可行,但是当数组下标太多,那么还是趋于O(n**3)

(2)第二种优化方式:一边dp,一边保存<元素,i下标>放入哈希表,注意第一个数遍历不到,需要在遍历之前先加入哈希表

4.填表方式:两种方式,先确定倒数第一个数,或者先确定倒数第二个数

but这里只能先确定倒数第二个数i,因为需要考虑dp之前hash表中的元素,因为k需要<i,所以不能将元素太早加入hash表中,要找i之前的k(所以这里的k需要是i下标之前的哈希表)

class Solution {public int longestArithSeqLength(int[] nums) {int n = nums.length;Map<Integer,Integer> hash = new HashMap<>();//<元素,下标>hash.put(nums[0],0);int[][] dp = new int[n][n];//初始化for(int i=0;i<n;i++) Arrays.fill(dp[i],2);int ret = 2;for(int i=1;i<n;i++) {//固定倒数第一个数for(int j=i+1;j<n;j++) {//固定倒数第二个数int a = 2*nums[i]-nums[j];//第一个数if(hash.containsKey(a)) {dp[i][j]=dp[hash.get(a)][i]+1;ret = Math.max(ret,dp[i][j]);}}hash.put(nums[i],i);//每次i换位置就将(nums[i],i)放入哈希表}return ret;}
}

四、等差数列的划分

446. 等差数列划分 II - 子序列

算法原理:

  💡细节: 

1.同上一题,一维dp数组无法判断是否能构成等差数列,只能知道子序列的个数,但是不能确定一个具体的子序列

2.状态转移方程:由于这里a可能有多个位置,but这里不只是看最后一个位置,而是每个位置都需要考虑,因为dp表示的是等差数列的个数,而不是最大长度

dp[i][j] +=dp[k][i]+1 (有多少个加多少个)

3.找k下标遍历优化:可以在dp之前,将<元素,下标数组>存入哈希表中

4.返回值:dp表的和(因为是个数)

5.代码注意:因为题目数据保证答案是一个 32-bit 整数,怕运算的时候越界,需要将int a改为long,同时Map第一个参数改为Long ,tmp也改为long

class Solution {public int numberOfArithmeticSlices(int[] nums) {int n = nums.length;int[][] dp = new int[n][n];Map<Long,List<Integer>> hash = new HashMap<>();//把<元素,下标数组>存入hashfor(int i=0;i<n;i++) {long tmp = nums[i];if(!hash.containsKey(tmp)) {//看以前是否创建了对应的下标数组hash.put(tmp,new ArrayList<>());}hash.get(tmp).add(i);//将下标放入下标数组}int sum=0;for(int j=2;j<n;j++) {for(int i=1;i<j;i++) {long a = 2L*nums[i]-nums[j];if(hash.containsKey(a)) {//看第一个数a是否存在for(int k:hash.get(a)) {if(k<i) dp[i][j]+=dp[k][i]+1;else break;//可能比i大的k有多个}}sum+=dp[i][j];}}return sum;}
}

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

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

相关文章

C++ 将字符串解析为argc、argv

文章目录 前言一、如何实现&#xff1f;1、实现split2、split双引号3、奇数下标元素加入结果4、偶数下标元素split空格 二、完整代码三、使用示例1、解析命令行2、构造argc、argv 总结 前言 一般开启子进程的时候&#xff0c;需要传参数&#xff0c;通常直接传输命令行字符串&…

怎么做微信在线预约

在快节奏的现代生活中&#xff0c;我们总是追求更高效、更便捷的服务体验。而微信&#xff0c;这个拥有数亿用户的社交平台&#xff0c;早已不仅仅是一个聊天工具&#xff0c;它更是一个融合了多种功能的综合性服务平台。今天&#xff0c;就让我们一起探讨如何通过微信在线预约…

软考--试题六--中介者模式(Mediator)

中介者模式(Meditor) 意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互 结构 适用性 1、一组对象以定义良好但是复杂的方式进行通信&#xff0c;产生的相互依赖关…

机房、配电室可视化运维这么卷?不搞3D,出门没法打招呼。

机房和配电室的可视化运维确实可以非常复杂和卷。通过使用3D技术&#xff0c;可以更加直观地展示机房和配电室的布局、设备分布和运行状态。 以下是一些与机房和配电室可视化运维相关的关键点&#xff1a; 3D建模&#xff1a;使用计算机图形学和3D建模软件&#xff0c;可以创建…

亚马逊测评真人号与自养号:如何选择?区别与作用全面解析

亚马逊卖家都希望能打造出热销产品的产品列表&#xff0c;因为评论对于列表的曝光和流量有着巨大的影响。然而&#xff0c;获取有效的产品评论并不容易&#xff0c;许多卖家为了提高自己产品在同类别中的竞争力&#xff0c;选择进行测评。测评可以快速提高产品的排名、权重和销…

AGV小车有什么优点?后期将在各行业逐渐取代人工物料搬运

AGV 随着工厂自动化、计算机集成制造系统技术的逐步发展、及柔性制造系统、自动化立体仓库的广泛应用&#xff0c;AGV作为连接和调节离散型物流管理系统使作业连续化的必要自动化搬运装卸手段&#xff0c;其应用范围和技术水平有了更为迅猛的发展。 AGV立体仓库 随着AGV自动化技…

WebGL软件的开发框架

WebGL&#xff08;Web Graphics Library&#xff09;是一种用于在网页浏览器中实现3D图形渲染的JavaScript API。它允许开发者利用图形处理单元&#xff08;GPU&#xff09;来实时渲染复杂的3D场景&#xff0c;从而创建出令人惊叹的交互式体验。在WebGL开发中&#xff0c;有一些…

记PLSQL链接Oracle数据库

一、环境 Windows环境安装plsql工具 Oracle部署在服务器上面。 由于我之前在本地Windows安装了一个Oracle数据库&#xff0c;结果导致之前已经在连接的PLSQL链接不上。 二、操作 PLSQL工具正常安装&#xff0c;主要就是一些Oracle的一些配置&#xff0c;和oracle客户端。 o…

农林科学SCI期刊,IF=6+,影响力高,对国人非常友好!

一、期刊名称 Crop Journal 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;农林科学 影响因子&#xff1a;6.6 中科院分区&#xff1a;1区 出版方式&#xff1a;开放出版 版面费&#xff1a;$900 三、期刊征稿范围 《作物杂志》是一份双月刊、国际、同…

Pikachu 靶场敏感信息泄露通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

RTMP低延迟推流

人总是需要压力才能进步, 最近有个项目, 需要我在RK3568上, 推流到公网, 最大程度的降低延迟. 废话不多说, 先直接看效果: 数据经过WiFi发送到Inenter的SRS服务器, 再通过网页拉流的. 因为是打金任务, 所以逼了自己一把, 把RTMP推流好好捋一遍. 先说说任务目标, 首先是MPP编码…

Docker部署nacos集群

前提&#xff1a; 购买一台服务器 虚拟机也行 &#xff0c;无论是哪一个内存都要足够 阿里&#xff1a;https://ecs-buy.aliyun.com/ecs?spm5176.8789780.J_4267641240.2.1e7e39fbopfoRn#/custom/prepay/cn-hangzhou 腾讯 、华为。。。。我目前只使用过这三个。 下载 Xshell …

第十节:Vue指令:v-for列表循环

1. 数组的循环 用 v-for 指令根据一组数组的选项列表进行渲染。 1.1 通过索引渲染数组内容 通过数组的索引获取数组的数据 <div id"app"><ul><li>{{ fruites[0] }}</li><li>{{ fruites[1] }}</li><li>{{ fruites[2] …

Spring:了解@Import注解的三种用法

一、前言 在 Spring 框架中&#xff0c;Import 注解用于导入配置类&#xff0c;使得你可以在一个配置类中引入另一个或多个配置类&#xff0c;从而实现配置的模块化。这对于组织大型应用程序的配置非常有用&#xff0c;因为它允许你将配置分散到多个类中&#xff0c;然后再将它…

C语言如何创建⼀个动态链表?

一、问题 创建动态链表就是指在程序执⾏过程中&#xff0c;从⽆到有&#xff0c;按照需求开辟结点和输⼊各结点数据&#xff0c;并建⽴起前后相连接的关系。那么&#xff0c;如何创建动态链表呢&#xff1f; 二、解答 以建⽴⼀个有任意名学⽣数据的单向动态链表为例&#xff0…

好用的Tipard 蓝光转换器 (Tipard Blu-ray Converter) mac&win

Tipard Blu-ray Converter 是一款令人惊叹的蓝光解决方案软件&#xff0c;可将蓝光光盘/文件夹转换为 1:1 质量的数字格式&#xff0c;速度提高 30 倍&#xff0c;用于 4K UHD 和 1080p 高清视频。它可以将蓝光光盘和文件夹中的蓝光电影转换为MKV、MP4、WMV、MOV、AVI、FLV、VO…

0.98T优于10米高程DEM数据

我们在《全球30米100%水陆覆盖高程》一文中&#xff0c;为大家分享了全球100%覆盖&#xff0c;且包括海底高程的30米DEM数据。 该数据虽然全球无死角覆盖&#xff0c;但分辨率只有30米。 这里&#xff0c;再为大家分享一个优于10米的高程数据&#xff0c;但目前仅覆盖全国范围…

华为设备使能Auto-Config功能

Auto-Config is working. Before configuring the device, stop Auto-Config. If you perform configurations when Auto-Config is running, the DHCP, routing, DNS, and VTY configurations will be lost. Do you want to stop Auto-Config? [y/n] 背景信息 此任务的应用场…

jumpserver接入ldap

ldap部署 基本安装和人员导入 1.CentOS7安装配置OpenLDAP与phpLDAPadmin (koomu.cn) 2.https://koomu.cn/centos7-install-openldap-server-and-phpldapadmin/ https://senmer.github.io/zh/posts/tech/ldap/openldap%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8/#%e4%b8%…

怎么做微信预约链接_微信预约新风尚

在快节奏的现代生活中&#xff0c;我们都渴望找到一种既方便又高效的方式来处理日常事务。无论是预约看病、预约美容&#xff0c;还是预约一场心仪的讲座或活动&#xff0c;我们都希望能够一键搞定&#xff0c;省时省力。今天&#xff0c;就让我来为大家揭秘如何制作一个微信预…