多数元素-摩尔投票

102 阅读1分钟

题目

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: nums = [3,2,3]
输出: 3

示例 2:

输入: nums = [2,2,1,1,1,2,2]
输出: 2

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

摩尔投票

设输入数组 nums 的众数为 x ,数组长度为 n 。

推论一:  若记 众数 的票数为 +1 ,非众数 的票数为 −1 ,则一定有所有数字的 票数和 >0 。

推论二:  若数组的前 a 个数字的 票数和 =0 ,则 数组剩余 (n−a) 个数字的 票数和一定仍 >0 ,即后 (n−a) 个数字的 众数仍为 x 。

Picture1.png

代码

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)