微软面试题:求整数随机数构成的数组中找到长度大于=3的最长的等差数列

看了网上自称是O(N^2)的算法,无语,那么复杂的空间复杂度,完全没有参考价值。

忘了在哪里看到,总之也是csdn。

还是正常的O(n^3)的算法比较给力,正常,一般情况也是能想到的

不保证以下代码正确性,思路大概就是那样


在这里用最简单的思路,时间复杂度为O(n^3)


思路:我们知道任意取2个元素,都能构成一个长度为2的等差数列,比如:a,b就等构成一个长度为2的,首元素为a,差为b-a的等差数列。

但是三个数:a,b,c(有序)就不一定了,因为c-b和b-a未必相等。


所以我们可以穷举出数列的前2个元素a[i], a[j],因为2个数必然构成一个等差数列,差为diff = a[j]-a[i]。然后j后面的元素中,找到一个a[k]使得a[k] = a[j]+diff,然后后在k后面找到a[n] = a[k]+diff,最后知道到达数组尾部。

我们可以定义一个变量length统计这个数列的最大长度,并且和已知的最大长度max比较,如果比Max大,就更新max = length。

同样我们可以定义一个stack来记录当前这个数列中的元素,并且定义另一个栈maxstack记录目前已知的最大长度的数列所包含的元素。

当遇到length>max的话,那说明maxstack也要重新赋值,所以我们就清空maxstack里原来的记录,用当前stack中记录的最长数列,去更新maxstack.



#include <vector>
#include <map>
#include <algorithm>
using namespace std;

int findLongestArray(vector<int> arr)
{
	int n=arr.size();
	sort(arr.begin(),arr.end());
	vector<vector<int>> dp(arr.size(),vector<int>(arr.size()));
	map<int,int> posMap;
	
	for(int i=0;i<n;i++)
	{
		posMap[arr[i]]=i;
	}
	
	int maxlen=2;
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			int base=a[j];
			int diff=a[j]-a[i];
			int len=2;
			for(int k=j+1;k<n;k++)
			{
				if(a[k]==base+diff)
					{
						base=a[k];
						len++;
					}
			}
			if(maxlen<len)
				{
					maxlen=len;
				}
		}
	}
	return maxlen;
}


参考:http://blog.csdn.net/fanzitao/article/details/7914167

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值