题目描述
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/2 ⌋ 次的元素。
分析:采用摩尔投票法,两个阶段:抵消阶段和计数阶段
抵消阶段:两个不同投票进行对抗,并且同时抵消掉各一张票,如果两个投票相同,则累加可抵消的次数;
计数阶段:在抵消阶段最后得到的抵消计数只要不为 0,那这个候选人是有可能超过一半的票数的,为了验证,则需要遍历一次,统计票数,才可确定
public static int majorityElement(int[] nums) {
int len = nums.length;
if (len==0){
return -1;
}
int major = 0;
int vote = 0;
for (int num:nums){
if (vote==0){
major = num;
vote = 1;
}else {
if (major==num){
vote++;
}else {
vote--;
}
}
}
if (vote==0){
return -1;
}
int flag = 0;
for (int num:nums){
if (major == num){
flag ++;
if (flag>len/2){
return major;
}
}
}
return -1;
}
网友评论