求一个整数数组中,最长的等差数列

本文探讨了求解最长等差数列子序列的算法,包括子序列不连续和连续两种情况。对于无序数组,通过排序并定义状态方程解决;连续子序列则采用线性时间复杂度算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:给定一个大小为n的数组,要求写出一个算法,求出其最长的等差数列的子序列。
解答:如果这个数组是无序的话,我们首先要对这个数组进行排序,因为我们很难定义一个无序数组的子问题。排序的时间代价为O(n*logn)
定义排序后的数组为a[1],a[2],...,a[n]
1,我们先来考虑子序列不连续的情况,
定义c[i,j]为以a[i]和a[j]为最后两个元素的最长子序列的长度。
c[i,j]=max{c[k,i]| a[k]-a[i]=a[i]-a[j], 1=<k<=i}+1。初始化为c[1,i]=2,c[i,i]=1
问题只要求出c[i,j]中的最大值即可。代码如下:


2,下面我们来考虑子序列连续的情况,这种情况只需要O(n)时间,O(1)空间 



问题的变种:给定一个数组,它可以看成是由n个等长的等差数列构成的,每个等差数列长度可以看成是l,但是其顺序是被打乱的,n和l都是未知的,要求写一个算法,求出最长等差数列的长度

转载于:https://www.cnblogs.com/kevinLee-xjtu/archive/2011/12/01/2299105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值