问题描述:给定一个大小为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都是未知的,要求写一个算法,求出最长等差数列的长度