其他分享
首页 > 其他分享> > 寻找数字

寻找数字

作者:互联网

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