先讨论超过数组长度一半的情况
超过数组长度一半意味着这个数字的个数大于其他全部数字个数之和,算法大致为,首先设置两个参数currentAxis,currentNum。参数currentAxis用来记录当前认为是我们要找的那个数字,参数currentNum用来记录CurrentAxis参数对应的那个数字连续出现的次数。步骤如下:
(1)初始化:设当前的数组为data[],数组的长度为n。currentAxis=data[0],currentNum=1;
(2)设i=1,遍历数组,转向(3);
(3)当data[i]==currentAxis时,currentNum++,转向(5);否则转向(4);
(4)currentNum--,当CurrentNum==0时,currentAxis=data[i];
(5)当i==data.length时,转向(6);否则,i++,转向(3);
(6)输出currentAxis
为什么这个算法有效了,假设数组长为10,其中1的个数为6.即6/10,从数组第一个数开始,遇到不相同的数,则跳过这两个数,跳过的两个数可能有一个为1,或者一个都没有,这样的话 概率为5/8或者6/8,依然大于1/2,一直循环 最后一个肯定是我们要找的数。
int funtion(int data[], int leng