算法题32 从随机数数组中选取长度不小于3的最长等差数列

题目:求随机数构成的数组中找到长度大于=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),平均时间复杂度谁能计算一下?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值