39. 数组中出现次数超过一半的数字
1 题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
2 题目分析
最直观的解法是先排序然后去找数组中间的元素即可,但时间复杂度就是O(nlogn),这里使用摩尔投票法:定义一种投票机制,初始化vote等于0,x=0,遍历数组,当vote等于0时将x更新为当前值,对当前值num和x进行比较,如果相等则vote加1,不相等则减一,循环结束返回x即可。
3 代码
public int majorityElement(int[] nums) {
// 摩尔投票法
int times = 0, res = 0;
for (int num : nums) {
if (times == 0) res = num;
times += num == res ? 1 : -1;
}
return res;
}