题目描述
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.
思路分析
对于上一题,数组中个数超过n/2的数值如果存在,则仅有一个。
数组中个数超过n/3的数值可能有两个。
思路和上题一样,这里我们先选定两个可能的频繁项res1,res2,设置两个计数器count1和count2。也是通过遍历数组,依次判断。一次循环后会得到两个可能的值。然后进行第二次循环,用以检验这两个值出现的次数是否大于n/3。上一题没有判断是因为题目假设一定存在个数超过n/2的值。
代码
List<Integer> res = new ArrayList<>();
if(nums.length<0)
{
return res;
}
/*int res1 = nums[0];
int res2 = nums[1];*/
int res1 = 0,res2 = 0;
int count1 = 0,count2 = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i] == res1)
{
count1 ++ ;
}else if (nums[i] == res2)
{
count2 ++;
}else if (count1 == 0)
{
res1 = nums[i];
count1 = 1;
}else if (count2 == 0)
{
res2 = nums[i];
count2 = 1;
}else{
count1 -- ;
count2 -- ;
}
}
//再次遍历数组,判断res1,res2的个数是否超过n/3
count1 = 0;
count2 = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i] == res1)
{
count1++;
}
if(nums[i] == res2)
{
count2++;
}
}
if(res1!=res2)
{
if(count1>nums.length/3)
{
res.add(res1);
}
if(count2>nums.length/3)
{
res.add(res2);
}
}else
{
if(count1>nums.length/3)
{
res.add(res1);
}
}
return res;