问题描述:
摩尔投票法:
票数和: 由于众数出现的次数超过数组长度的一半;若记 众数 的票数为 +1+1 ,非众数 的票数为 -1−1 ,则一定有所有数字的 票数和 > 0>0 。
票数正负抵消: 设数组 nums 中的众数为 xx ,数组长度为 nn 。若 nums 的前 aa 个数字的 票数和 = 0=0 ,则 数组后 (n-a)(n−a) 个数字的 票数和一定仍 >0>0 (即后 (n-a)(n−a) 个数字的 众数仍为 xx )。
算法原理:
算法流程:
复杂度分析:
class Solution {
public int majorityElement(int[] nums) {
int x = 0, votes = 0, count = 0;
for(int num : nums){
if(votes == 0) x = num;
votes += num == x ? 1 : -1;
}
// 验证 x 是否为众数
for(int num : nums)
if(num == x) count++;
return count > nums.length / 2 ? x : 0; // 当无众数时返回 0
}
}