求随机数构成的数组中找到长度大于或等于3的最长的等差数列
来源:互联网 发布:2015年退休金的计算法 编辑:程序博客网 时间:2024/05/12 04:02
转自:http://www.cnblogs.com/eric-blog/archive/2012/05/04/2483402.html
输出等差数列由小到大?如果没有符合条件的就输出“NO”。
例如: 输入[1,3,0,5,-1,6] ,输出[-1,1,3,5] 。
要求:时间复杂度,空间复杂度尽量小
解体思路:设随机数为a[],首先排序,
(1)枚举两个数,作为数列中相邻的两个元素Ai,Ai+1,那么可求出等差d=Ai+1-Ai。于是Ai-1=Ai-d,Ai+2=Ai+1+d,因此可以在剩下的数寻找Ai-1,Ai+2是否存在,可以用一个set来维护查找,而数列最长可为n,查找次数最大为n,而查找复杂度为logn,总时间复杂度为O(n^3logn)。复杂度太高,不可取。
(2)动态规划求解。设f[i][j]为以a[i],a[j]结尾的等差数列的最长长度。那么
递归方程为:f[i][j]=max{f[k][i]+1,a[k]-a[i]==a[i]-a[j]},起始条件f[i][j]=1;伪代码如下:
for(int k =0; k <n; k++)
for(int i=k+1;i<n;i++)
for(int j=i+1;j<n;j++)
if(a[k]-a[i] == a[i]-a[j])
f[i][j] = (f[i][j]<f[k][i]+1?f[k][i]+1:f[i][j]);
而,最长长度为即为max{f[i][j]},即以a[i],a[j]结尾,通过一次查找即可求出是那些元素组成的解。复杂度O(n^3)。
(3)枚举等差,将所有差相同的数对(a,b),分别以a,以b作为key,另一个作为值,插入到两个map之中,然后解必然在某一个map之内。于是,枚举每一个map,进行删除操作,比如(a,b)那么下一个值为b+(b-a),前一个值为a-(b-a),分别到两个map中去查找,迭代之。复杂度O(n^2logn)。
- 求随机数构成的数组中找到长度大于或等于3的最长的等差数列
- 求随机数构成的数组中找到长度大于或等于3的最长的等差数列
- 求随机数构成的数组中找到长度大于=3的最长的等差数列
- 求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 求随机数构成的数组中找到长度大于=3的最长的等差数列
- 微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 94.微软笔试题 求随机数构成的数组中找到长度大于=3 的最长的等差数列
- 微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列
- 【每日面试题】随机数构成的数组中找到长度大于=3 的最长的等差数列
- 求整数随机数构成的数组中找到最长的等差数列
- 随机数中寻找长度大于3的等差数列
- 动态规划-数组中求最长等差数列的长度
- 找出数组中长度最长的等差数列
- ubuntu14.04 64位 jd-gui
- An internal error occurred during: "Redeploy". java.lang.NullPointerExceptio
- WebQQ协议分析(5)——获取好友信息(2)
- POJ3009 Curling 2.0 (dfs入门题)
- 【启发式搜索】A*与IDA*学习笔记
- 求随机数构成的数组中找到长度大于或等于3的最长的等差数列
- c++中c_str()用法
- 用函数指针调用函数
- 《网络编程》套接字地址与名字转换
- Palindrome Number -- leetcode
- WebQQ协议分析(6)——获取群信息(1)
- 《数据结构》第七章 查找 学习问题回收站
- Mybatis3.2.1整合Spring3.1
- WebQQ协议分析(7)——获取群信息(2)