标签:
例子: 3,8,4,5,6,2 返回值应该为 :5
这是昨天做的一道优酷土豆的编程题,和leetcode中的128/ Longest Consecutive Sequence 有点相似,但是leetcode题的公差是确定的1,而这道题的公差是不确定的。
本人的写出的是一种通过穷举的方法实现查找最长等差数列,通过hash使查找更为方便,减少了复杂度。
int calcAPLength(const vector<int> &intAr) // 找数列中,最长的等差数列的长度 ,返回该数列的长度 { if (intAr.size() <= 2) return intAr.size(); vector<int> t = intAr; sort(t.begin(),t.end()); auto p=unique(t.begin(),t.end()); int l = p - t.begin(); // 经过排序和unique后数组的长度 注意:unqiue并没有将重复的元素删除,而是放在了数组的后面 map<int, int>my; int test = 1; // hash ,并初始化 for (int i = 0; i < l; i++,test++) my[t[i]] = test; int re = 2; int diff; for (int i = 0; i < l; i++) // 遍历数组, { for (int j = 1; j < l; j++) // 公差: 与第j个元素的差 { int index = j + i; if (index >= l) break; diff = t[index]-t[i]; int temp = 2; while (my[diff + t[index]] <= l && my[diff + t[index]]>0 ) //查找下一个元素是否存在 { index = my.find(diff + t[index])->second-1; temp++; } re = max(re, temp); } } return re; }
注意:unqiue并没有将重复的元素删除,原来数组的长度也并没有改变,而是把重复的元素放在了数组的后面。
希望有人能提出更好的方法!
n个整数中,找出尽可能多的数使他们组成一个等差数列,求最长等差数列的长度
标签:
原文地址:http://www.cnblogs.com/NeilZhang/p/5427978.html