题意如下:
    有一个数在一个数组中出现50%以上,让你在O(n)的时间内,O(1)的空间复杂度,找出那个数,其中数组内的数都是随机数,但是有范围。


当时没想出什么好的方法,就没再想。第二天早上去植树的时候,挖完了四个大坑,休息时看着zn在那儿挖坑,看着一排坑,一个一个插入树苗填上,看着看着想到了这道题的解决思路,大致如下:
一个数超过了50%,那么就每次拿这个数(设为A)和其它数抵消,最后剩下的肯定是它,但是空间复杂度是O(1),所以只能顺序的读入数组,且不能整个存储。那么就不能保证每次都是拿A和非A抵消,再一想,只要抵消两个不同的数就行了,那么如果碰到两个相同的数呢,留一个,但是要记录重复的次数,稍加考虑就能看出,这个次数始终记录的都会是一个数重复的次数,不会出现要同时记录多个数的重复次数,因为遇到不同的就抵消了,这样的话只要开3个数的空间,顺序扫描一边数组就能得出所要求的数。下面举个简单例子:
    数组内数为:2 2 2 4 4 3 3 2 2 2
    经过三步处理之后当前数是2,重复次数是3,遇到4,当前数还是2,重复数-1=2,如此下去,当遇到第二个3时,当前数是3,遇到下一个2,抵消,再遇到2,当前数就是2,最后当前数仍是2,重复数是1,则所求是2...

 

作者的思路很酷!

原文出处:http://bbs.linuxpk.com/thread-14429-1-1.html