题目:求随机数构成的数组中找到长度大于=3的最长的等差数列
输出等差数列由小到大: 如果没有符合条件的就输出[0,0].
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
要求时间复杂度,空间复杂度尽量小
算法分析:
1)对于a1,a2,a3为等差数列,那么a3,a2,a1也为等差数列。
2)如果一个有n个元素的等差数列首元素为a1,公差为d,那么a1+i*d,一定在等差数列中,i = 1,2,3, ..., n-1.
对于本题:
1)如果数组的最大值为max,最小值为min,那么拥有最长递增等差数列的公差d一定不大于(max-min)/m,其中m为等差数列中元素的个函数
算法设计如下:首先确定一个等差数列首元素以及公差,去查找是否存在下一个元素,因此需要一个查找复杂度尽量小的结构,同时选择首元素要选择尽量小的,该结构中数据存储有序,同时还要考虑到可能会出现重复元素。因此可采用multiset,multimap
1)建立一个multiset对象,存储所有数组元素。
2)对multiset中第i个元素作为数列首元素,第j个元素作为第二个元素(j = i+1, ..., n),构造等差数列,去查找是否存在该数列的第三、四个元素。
3)记录下已查找的所有元素中,等差数列最大长度以及其首元素和公差。
4)如果公差为0,特殊处理。
5)如果构造的公差不小于(max-min)/3,直接退出本决策,进行下一决策。
6)如果后面的元素个数已经小于当前已经得到的最长数列长度,停止查找。
测试代码:
验算结果:
从数列中求最长等差数列:1 6 4 8 9 5 9 1 7 7
最长等差数列(长度为6):4 5 6 7 8 9
从数列中求最长等差数列:4 8 1 9 6 0 2 4 7 1
最长等差数列(长度为5):0 2 4 6 8
从数列中求最长等差数列:3 6 6 3 1 0 5 4 1 5
最长等差数列(长度为4):3 4 5 6
从数列中求最长等差数列:9 8 3 6 9 8 9 5 9 5
最长等差数列(长度为4):9 9 9 9
从数列中求最长等差数列:6 4 9 7 8 0 0 1 0 8
最长等差数列(长度为4):6 7 8 9
从数列中求最长等差数列:3 4 4 7 7 4 2 3 4 7
最长等差数列(长度为4):4 4 4 4
从数列中求最长等差数列:8 2 5 5 7 7 7 7 0 4
最长等差数列(长度为4):7 7 7 7
从数列中求最长等差数列:6 6 3 2 0 4 8 5 3 2
最长等差数列(长度为5):0 2 4 6 8
从数列中求最长等差数列:8 8 7 4 1 3 3 1 8 4
最长等差数列(长度为3):8 8 8
从数列中求最长等差数列:0 4 5 5 2 1 4 5 3 9
最长等差数列(长度为6):0 1 2 3 4 5
PS: 空间复杂度O(1),平均时间复杂度谁能计算一下?