给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
输入: [3,2,3]
输出: 3
示例 2:
输入: [2,2,1,1,1,2,2]
输出: 2
编程思想:
简单来讲:就是相互抵消(摩尔投票法)
实现的前提是在数组必然有一个数是众数,也就是说这个数组中一定有一个数出现的次数大与 n/2
我的理解就是,目前肯定有一个数的个数 大于n/2
然后就相互抵消,将众数与非众数相互一一抵消
剩下的一个或者多个数肯定是众数
这个众数在数组里面肯定抵消不完的
代码实现(java) :
public int majorityElement(int[] nums) {
int res = 0; // 当前判断为众数的数字,
int num_i = 0; //nums中的众数重复数字个数
for (int num : nums) {
if (num_i == 0) {
res = num;
++num_i; //初始化和当众数个数减为一时,取下个数为众数
} else if (num == res) {
++num_i; //遇到与众数相同个数加1
} else
--num_i; //遇到与众数不相同个数减1
}
return res;
}
如果不能保证数组中一定存在众数,则判断的结果不一定是众数,则需要判断其个数是否大于数组元素个数1/2.
for (int s : array) {
if (s == cur) {
nu2++;
}
}
if (nu2 >= array.length / 2) {
return cur;
} else {
return 0;
}