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

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

     
  • 相关阅读:
    控制TABLE的一些属性
    windows7中各个dll文件作用和用途
    left join on and与left join on where的区别
    号外,left join比连表语句快80倍
    JS跳转语句
    [jQuery,Dojo,MooTools]
    CYQ.Data 数据框架 V3.5 开源版本发布(源码提供下载)
    Scala开发小小总结
    性能测试工具原理与架构
    joomla1.5模块开发和插件开发详解带实例
  • 原文地址:https://www.cnblogs.com/NeilZhang/p/5427978.html
Copyright © 2011-2022 走看看