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

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

     
  • 相关阅读:
    在python3.x上安装suds 并访问webservice
    numpy nonzero与isnan
    彻底弄清python的切片
    pandas read_sql与read_sql_table、read_sql_query 的区别
    dataframe to sql
    同时替换掉多个字符串
    matplotlib中在for中画出多张图
    MySql 创建/删除数据库
    python3与anaconda2共存
    js调用打印机
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/5427978.html
Copyright © 2020-2023  润新知