这个问题不适合大量投入。
问题陈述
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;
}
注意:不适用于这些输入
答案 0 :(得分:2)
您使用的是使用O(N^2)
操作的算法。
我的建议:
O(N*log(N))
操作。O(N)
操作。这就是我改变核心算法的方法:
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));
}