方法一:
用map记录数字和出现次数并判断:
public int majorityElement1(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
if (map.containsKey(num)) {
int time = map.get(num);
if (++time > nums.length/2) {
return num;
}
map.put(num, time);
} else {
map.put(num, 1);
if (1 > nums.length/2) {
return num;
}
}
}
return -1;
}
原本用int数组直接下标赋值也可以实现,但数字可能有负数,所以不能用数组。
方法二:
因为查找数量超过一半的数字,那么对数组排序后,中位数即为目标数字。
public int majorityElement3(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
方法三:
摩尔投票法:
首先,当前数为众数时,投票数+1,不是众数投票数-1。那么最后众数投票数一定大于0.
推论:当数组前a个数投票为0时,后n-a个数投票一定大于0,即后n-a个数的众数不变。
每当遇见0,假设当前数为众数,那么最后投票大于0时,众数就找到了。
public int majorityElement(int[] nums) {
int res = 0;
int vote = 0;
for (int i : nums) {
if (vote == 0) {
res = i;
}
vote += (res == i) ? +1 : -1;
}
return res;
}