n个整数中,找出尽可能多的数使他们组成一个等差数列,求最长等差数列的长度

例子:  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并没有将重复的元素删除,原来数组的长度也并没有改变,而是把重复的元素放在了数组的后面。

 希望有人能提出更好的方法!

 
原文地址:https://www.cnblogs.com/NeilZhang/p/5427978.html