寻找数字
作者:互联网
Problem
Example&Prompt
Solution1(40pts)
考虑桶排,对于每个数 \(i\),其出现次数为 \(f_i\),找一找有没有 \(f_i\) 大于 \(\lfloor \dfrac n 4\rfloor\) 的就可以了,时间复杂度和空间复杂度为\(O(n+\max a_i)\),。
Solution2(80pts)
考虑优化 Solution1,对\(f_i\)使用 Hash,可以得到 80pts的好成绩,但过不了最后四个测试点。
Solution3(100pts)
因为题目给出的数列是乱的,并且排序后不影响答案,所以可以先排序,再找相同的数出现过几次就可以了。
如何去找呢?很明显有一个 \(O(\dfrac{n^2} k+ansn)\)的暴力乱搞做法( \(k\) 代表有几种不同的数),对于每个数,往后扫到与这个数不一样的数,如果符合要求,就再去重,继续扫下一个数。
Solution4(100pts)
考虑优化 Solution3,既然我们已经对所有相同的数扫完了,那直接扫下一个不同的数,因为如果这个数符合要求,在扫一遍没有任何意义,如果这个数不符合要求,那下一个相同的数一定也不符合要求,因为下一个相同的数出现次数一定小于这个数,时间复杂度为\(O(n)\)。
加上排序,时间复杂度为\(O(n\log n)\),放张图更好理解:
Code
upd:大水题+1
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
int sum=0,k=i;
for(int j=i;a[i]==a[j];j++)
sum++,k=j;
i=k;
if(sum>n/4)
printf("%d\n",a[i]),flag=true;
}
if(flag==false)puts("No number.");
标签:数字,相同,复杂度,符合要求,寻找,Solution3,Solution1,排序 来源: https://www.cnblogs.com/qinchenhao/p/15100439.html