寻找数组中出现次数超过1/3的众数。
实际上数组中符合条件的众数最多只可能存在两个。我们不妨用n1和n2来表示,count1和count2来表示这两个数出现的次数。遍历数组,当ni重复出现,增加counti,否则减少count1和count2。若counti为0,则可以换一个新的数作为新的ni。这样做肯定能够保证最终符合条件的众数在n1和n2中(i的每一次出现,要么导致其count++,要么导致count1和count2都减一)。最终再检查一下n1和n2是否走满足条件即可。
时间代价是O(n)的,空间代价是O(1)的。
public class Solution {
public List<Integer> majorityElement(int[] nums) {
int len = nums.length;
int n1=0,n2=0,count1=0,count2=0;
List<Integer> rt = new ArrayList<Integer>();
for(int i=0;i<len;i++)
{
if(count1>0&&count2>0)
{
if(nums[i] == n1)
{
count1++;
}
else if(nums[i] == n2)
{
count2++;
}
else
{
count1--;
count2--;
}
}
else if(count1>0)
{
if(nums[i] == n1)
{
count1++;
}
else
{
n2 = nums[i];
count2++;
}
}
else if(count2>0)
{
if(nums[i] == n2)
{
count2++;
}
else
{
n1 = nums[i];
count1++;
}
}
else
{
n1 = nums[i];
count1++;
}
}
count1=0;count2=0;
for( int i=0;i<len;i++ )
{
if(nums[i] == n1)
{
count1++;
}
if(nums[i] == n2)
{
count2++;
}
}
if(count1 > len/3)
{
rt.add(n1);
}
if(count2 > len/3 && n1!=n2)
{
rt.add(n2);
}
return rt;
}
}