求众数
给定一个数组大小n,求其中出现的次数严格大于n/3的元素
方法:摩尔投票法
步骤:
-
第一次遍历 需要找出数量出现最多的 两个数字;
-
第二次遍历 需要找出准确的出现次数,因为第一次遍历可能会漏掉一些次数;
-
最后,要检查次数大于 n/3 的 才算众数。
代码如下
class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
int result1 = 0, result2 = 0, count1 = 0, count2 = 0;
//若需找出大于n/m的数(即m-1个众数),则需各m-1个result和count
for (int x : nums) {
if (x == result1)
count1++;
else if (x == result2)
count2++;
else if (count1 == 0) {
result1 = x;
count1 = 1;
} else if (count2 == 0) {
result2 = x;
count2 = 1;
} else {
count1--;
count2--;
}
} //此循环找出出现最多的两个众数(若为n/m,则找出m-1个众数)
count1 = count2 = 0;
for(int x : nums) {
if(x == result1)
count1++;
if(x == result2)
count2++;
} //此循环统计各众数出现的具体次数
if(count1 > (nums.length/3))
list.add(result1);
if((count2 > (nums.length/3)) && (result2!=result1))
list.add(result2); //此判断众数是否合乎题干且是否重复
return list;
}
}