Arithmetic Progressions(暴力 hash_map)

 题意:给你N个数,求这些数能组成的等差数列的最长的长度。

思路:暴力,每个 a[ i ],当成首项,然后求枚举 a[i+1]-a[i]=d,在来一层for循环,从i+1开始,检查从i+1到N有多少以d为公差的数,这里需要用hash_map标记一下,如果用map的复杂度是O(logn),hash_map的复杂度是O(1)。

#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include <hash_map>
using namespace std;
using namespace __gnu_cxx;
const int N=5e3+10;
const double eps=1e-7;
typedef long long  ll;
int n,l;
int a[N];
int main()
{
    int n;
    scanf("%d",&n);
    hash_map <int,int>q;
    for(int i=0; i<n; i++)
    {

        scanf("%d",&a[i]);
        q[a[i]]=1;
    }
    sort(a,a+n);
    int sum=-5;
    for(int i=0; i<n; i++)
    {
        for(int j=i+1; j<n; j++)
        {
            int tp1=a[i];
            int d=a[j]-a[i];
            int ans=1;
            while(1)
            {
                int tp2=tp1+d;
                if(tp2>a[n-1])
                    break;
                if(q[tp2]!=0)
                {

                    ans++;
                    tp1=tp2;
                }
                else
                    break;
            }
            if(sum<ans)
                sum=ans;
        }
    }
    printf("%d
",sum);

}
View Code

 

原文地址:https://www.cnblogs.com/sszywq/p/13768028.html