题目
给定一个大小为
n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入: nums = [3,2,3]
输出: 3
示例 2:
输入: nums = [2,2,1,1,1,2,2]
输出: 2
提示:
n == nums.length1 <= n <= 5 * 104-109 <= nums[i] <= 109
摩尔投票
设输入数组
nums的众数为 x ,数组长度为 n 。
推论一: 若记 众数 的票数为 +1 ,非众数 的票数为 −1 ,则一定有所有数字的 票数和 >0 。
推论二: 若数组的前 a 个数字的 票数和 =0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 >0 ,即后 (n−a) 个数字的 众数仍为 x 。
代码
public int majorityElement(int[] nums) {
int x = 0, votes = 0;
for (int num : nums){
//如果票数抵消为0,则遍历过的都不是众数,选择后面第一个未遍历的为众数
if (votes == 0){
x = num;
}
//众数时票数+1,否则减1
votes += num == x ? 1 : -1;
}
return x;
}
时间复杂度O(n) 空间复杂度O(1)