求众数 II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。
说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。
示例 1:
输入: [3,2,3]
输出: [3]
示例 2:
输入: [1,1,1,3,3,2,2,2]
输出: [1,2]
思路+代码+注释:
public List<Integer> majorityElement(int[] nums) {
/*
思路:大小为n的数组,元素个数超过n/3的元素不会超过两个,所以先选举出两个众数,由于没有说一定存在所以在验证一下两个选举的数是否为众数
推举众数的过程:使用变量n记录第一个众数、变量m记录第二个众数,如果遍历的数和n相同那么n的个数+1,否则和m比如果相同m的个数+1,都不相同
n的个数-1m的个数-1,当n的个数为0时说明第一个众数和其他数出现次数相同不在可能为众数那么将新的数设置为第一个众数,m同理,由于使用
n代表第一个众数、m代表第二个众数所以先判断n后来判断m
*/
int n=0;
int m=0;
int cn=0;
int cm=0;
for (int i:nums
) {
if (i==n)
{
cn++;
}else if (i==m)
{
cm++;
}else if (cn==0)
{
n=i;
cn++;
}else if (cm==0)
{
m=i;
cm++;
}else {
cn--;
cm--;
}
}
cn=0;
cm=0;
for (int i:nums
) {
if (n==i)
{
cn++;
}
else if (m==i)
{
cm++;
}
}
List<Integer> res=new ArrayList<>();
if (cn>nums.length/3)
{
res.add(n);
}
if (cm>nums.length/3)
{
res.add(m);
}
return res;
}