1.题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
2.示例:
输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2
3.解题思路:
摩尔投票:
当一个数大于数组长度一半时,把数组中的数两两相销。剩下的数就是出现次数最多的数。
例如:A,B,C三个部落进行战斗,选出头领部落
[A,B,B,C,B]其中A,B,C分别代表各个部落的人。当他们俩俩进行决斗,剩下的就是B部落。
初始化:预期结果 cur = 0 和计数器 count = 0
遍历数组 nums,遍历过程中取到的数字为 num
当 count 为 0 时,表示不同的数字已经将当前的结果抵消掉了,可以换新的数字进行尝试,则 cur = num
当 num == cur 时,表示遍历数字和预期结果相同,则计数器 count++
当 num != cur 时,表示遍历数字和预期结果不同,则计数器 count--
最终留下的数字 cur 就是最终的结果,出现次数超过一半的数字一定不会被抵消掉,最终得到了留存
4.题解:
int majorityElement(int* nums, int numsSize){
int cur=0;
int count = 0;
for(int i=0;i<numsSize;i++){
if(count==0){
cur = nums[i];
}
if(cur==nums[i]){
count++;
}else{
count--;
}
}
return cur;
}
注意:本题的解法只适用于该题目。如果题目改为找出数组中出现次数最多的数,就不再适用。
本题还可以用排序,找中位数的方法来做。