123132129122请用Java代码找出这个数组中出现次数大于三分之一次的数输出并且解释一下代码
public static void findMajorityElement(int[] nums) {
int candidate1 = 0, candidate2 = 0;
int count1 = 0, count2 = 0;
for (int num : nums) {
if (num == candidate1) {
count1++;
} else if (num == candidate2) {
count2++;
} else if (count1 == 0) {
candidate1 = num;
count1 = 1;
} else if (count2 == 0) {
candidate2 = num;
count2 = 1;
} else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (int num : nums) {
if (num == candidate1) {
count1++;
} else if (num == candidate2) {
count2++;
}
}
if (count1 > nums.length / 3) {
System.out.println(candidate1);
}
if (count2 > nums.length / 3) {
System.out.println(candidate2);
}
}
这段代码采用的是摩尔投票算法,其思想是找到一个数,它在数组中出现的次数大于一半,即假设这个数为众数。在遍历数组时,如果当前数字与候选众数相同,则将计数器加1;否则,将计数器减1。如果计数器为0,则将候选众数替换为当前数字,并将计数器设为1。最后再遍历一遍数组,统计候选众数的出现次数,如果出现次数大于三分之一,那么这个数就是出现次数大于三分之一次的数。
时间复杂度为O(n),空间复杂度为O(1)。
原文地址: https://www.cveoy.top/t/topic/E3E 著作权归作者所有。请勿转载和采集!