标签:还需要 遍历数组 核心 默认 偶数 初始化 height 技术分享 数值
要求:时间复杂度为O(n),空间复杂度为O(1)
1、找出次数超过1/2的数
遍历数组num,每次删除两个不同的数,最后剩下的数字便是所求,因为个数超过一半的数字是不会被消除完的。
比如:1 2 1 1 3
编程思路:
比如:num={1 ,2,2,1,1,3,1}
代码示例:
2、找出出现次数超过1/3的两个数
同理:每次删除3个不同的数,最后剩下两个数。
实现步骤:输入数组num
例如:num={1 2 3 2 2 4 3 3}
核心代码:
注:
1)此题中已默认一定存在超过1/2的众数和超过1/3的两个数,若没有说明,还需要对得出来的候选集进行次数验证!
2)其他情形:求超过1/m的数,一样可用此方法解决;即定义m-1个不同的数,以及(m-1)个不同的计数,初始化数为不同值,计数为0,寻找并删除之。
3、若一个数组中,只有一个数出现奇次,其他均出现偶次,找出这个数。
利用异或:相同的数异或为0,不同的数异或为1
总结:奇数个异或是本身,偶数个异或是0,0^a=a,异或满足交换律
例如:1 2 1 2 3 3 3,寻找奇数项
做异或:1^2^1^2^3^3^3=1^1^2^2^3^3^3=0^0^0^3=3
标签:还需要 遍历数组 核心 默认 偶数 初始化 height 技术分享 数值
原文地址:https://www.cnblogs.com/liuqing910/p/9061054.html