首答,欢迎追问与提意见,先说我的思路,用桶,以空间换时间的方式得到最快速度的答案,C代码在最下面,已测试。
测试结果:
思考了一会,按照常规方法走,如果没有特殊要求,用排序是可以的。最快的排序算法是时间复杂度是 O(nlogn)
十万的数据量的复杂度,也就是进行 100000*log(100000) = 17万次运算。
以现在计算机的运算速度(单位是每秒百万条指令),如果你不是做一些有时间限制的竞赛(ACM)的话,是完全可以的。
但这道题如果放在ACM竞赛中,如果用排序方法去做应该是铁铁的超时了。
于是我用桶(C语言桶的概念不懂请百度)做了一个以空间换时间的折中算法,时间复杂度是O(n),也就是10万次运算。空间复杂度取决于最大数字。如果最大数字是10万,就要开辟10万的数组空间,如果最大数字是20万,就要开辟20万的数组空间。如果最大数字是一百万,就要开辟一百万数组大小的空间,C语言不支持开辟这么多连续的内存空间,如果你真有这个问题,可以在segmentfault上提一个新问题,或者在答案下追问。
具体思路:
结果分为两个堆:0堆和1堆。
用桶存放所有元素的出现次数,对桶进行遍历,记录数组中所有的元素出现次数之和为count