题目:求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例:
输入: [3,2,3]
输出: 3
输入: [2,2,1,1,1,2,2]
输出: 2
思考:
这道题可以通过摩尔投票算法来解决。
通俗的讲就是:
先假设数组第0个就是所要求众数result,用一个变量times记下其出现次数为1次,然后向后遍历数组元素分别与这个数对比,如果相等则times+1,这很好理解。
如果不等就说明有另一个数出现了1次,这个数的出现“抵消”了原来result出现的1次,将times-1。
当times等于0时,说明原来认为的众数result出现次数,被“抵消”完了。则将下一个数认为是新的所求众数。
注:因为数组非空且给定的数组是一定存在这个众数。所以假如数组长度为偶数2n,则不会有一个数出现n次其他数也出现n次的情况。
所以按照算法思路最终会剩下一个数就是所要求的众数。
实现:
class Solution {
public int majorityElement(int[] nums) {
int result = nums[0];
int times = 1;
for (int i = 1; i < nums.length; i++) {
if (result == nums[i]) {
times++;
} else {
times--;
if (times == 0) {
result = nums[++i];
times++;
}
}
}
return result;
}
}