对于大输入,“由于超时而终止”

时间:2015-03-08 08:06:10

标签: c memory long-integer

这个问题不适合大量投入。

问题陈述

Sherlock被Watson给出了N个整数A0,A1 ...... AN-1的数组。现在Watson问Sherlock有多少个不同的索引对i和j存在,这样我不等于j,但Ai等于Aj。

也就是说,Sherlock必须计算指数(i,j)的总数,其中Ai = Aj且i≠j。

输入格式 第一行包含T,即测试用例的数量。 T测试案例如下。 每个测试用例由两行组成,第一行包含整数N,数组大小。 下一行包含N个空格分隔的整数。

输出格式 对于每个测试用例,请在不同的行中打印所需的答案。

约束 1≤T≤10 1≤N≤10^ 5 1≤A[i]≤10^ 6

示例输入

2

3

1 2 3

3

1 1 2

示例输出

0

2

解释 在第一个测试用例中,不存在满足给定属性的两对索引。 在第二个测试用例中,A [0] = A 1 = 1,索引(0,1)和(1,0)对满足给定的属性。

代码

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    long n,*a,i,j,count;
    int opt;
    scanf("%d",&opt);
    while(opt--)
        {
        count=0;
        scanf("%ld",&n);
        a=malloc(sizeof(long)*n);
        for(i=0;i<n;i++)
            scanf("%ld",&a[i]);
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                if(a[i]==a[j]&& i!=j)
                    count++;

        printf("%ld\n",count);
    }
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */    
    return 0;
}

注意:不适用于这些输入

Input

Output

1 个答案:

答案 0 :(得分:2)

您使用的是使用O(N^2)操作的算法。

我的建议:

  1. 先排序数字。这将是O(N*log(N))操作。
  2. 然后,走完排序列表。它将是一个线性的O(N)操作。
  3. 这就是我改变核心算法的方法:

    qsort(a, n, sizeof(long), myCompare);
    
    for(i=0;i<n;i++)
    {
       for(j=i+1;j<n;j++)
       {
          if(a[i]==a[j])
          {
             count++;
          }
          else
          {
             i = j-1;
             break;
          }
       }
    }
    

    qsort使用的函数:

    int myCompare(void* first, void* second)
    {
       return (*(long*)first < (*(long*)second));
    }