先讨论超过数组长度一半的情况
超过数组长度一半意味着这个数字的个数大于其他全部数字个数之和,算法大致为,首先设置两个参数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

这篇博客介绍了如何找出数组中出现次数超过数组长度一半或超过1/3的数字。算法通过维护当前认为的目标数字及其连续出现次数,遍历数组并更新状态。在大于1/2的情况下,算法保证了每次跳过不匹配的数字后,剩余部分仍满足条件。对于大于1/3的情况,类似地处理两个潜在的数字,最终通过遍历数组确认哪个超过1/3。
最低0.47元/天 解锁文章
5149

被折叠的 条评论
为什么被折叠?



