我无法解决这个问题 problem
此代码超出了时间限制,所以我需要让时间复杂度变得更加模糊,我认为
#include <stdio.h>
int main()
{
int a[100000], i, j, min, b, tmp;
scanf("%d", &b);
for (i = 0; i < b; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < b; i++)
{
min = a[i];
tmp = i;
for (j = i; j < b-1; j++)
{
if (min > a[j])
{
min = a[j];
tmp = j;
}
}
a[tmp] = a[i];
a[i] = min;
if (i > 0)
{
if (a[i-2] != a[i] && a[i] == a[i-1]) printf("%d\n", a[i]);
}
}
return 0;
};
答案 0 :(得分:0)
您的排序算法具有复杂度O(n^2)
。对于大小为10^5
的输入,它比O(nlogn)
快速排序算法要多许多倍。
在这里,您可以使用qsort()
来解决问题。
qsort(a, b, sizeof int, cmp);
cmp
int cmp(const void *a, const void *b)
{
return (*(int *) a - *(int *) b);
}
排序后的算法要简单得多。
int p = a[0], ct=0;
for(size_t i = 1; i<=b-1; i++)
{
if( a[i] == a[i-1])
ct++;
else{
if( ct > 1){
// a[i-1] should be printed.
}
ct = 1;
}
}
if( ct > 1){
//a[b-1] should also be print.
}
这个想法是这样的
随着数字的排序,我们将得到一个单调的序列。
我们将每个数字与之前的数字进行比较。如果有重复,则它们将显示在下一个旁边。
我们只收集多次出现的数字。
此外,您可以遵循的内容很少
在方法中声明大变量有时会受到可用内存(自动存储持续时间)的限制。(可能有stackoverflow等)使其成为全局。(静态存储持续时间)。
变量名称不是readable
。
如果使用排序算法,您可以获得帮助。
了解不同算法的复杂性有所帮助。在你的情况下,复杂性是O(n ^ 2)。比这更好的排序算法是流行的合并排序等。这个简单的想法解决了你的问题。
您可以检查一下,此代码至少比您的版本更具可读性。这有助于避免小错误。
int temp = a[0], count=0; for(size_t i = 1; i<=len-1; i++) { if( arr[i] == arr[i-1]) count++; else{ if( count > 1){ // a[i-1] should be printed. } count = 1; } } if( count > 1){ //arr[len-1] should also be print. }