在LeetCode上刷题,碰见了一个简单的题:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
首先想到的做法是做类似桶排序那样,开辟一个数组统计各个数字出现的次数。但是这样一来空间复杂度有点高。不够优雅。。。于是百度了一下,看到了摩尔投票法:
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;
}
}
这段算法很妙,仅遍历了一遍数组,用了俩变量就找出出现次数最多的数字。
我的理解就是,挨个拿数组中的数字去做抵消,最后剩下的就是数组中出现次数最多的那个数字。