第一个题保证了一定有majority 这个题没有保证
首先要找到两个count最大的数字 然后再验证是否真的大于1/3
不用纠结那两个maj初始化成什么 因为循环中会正确的初始化 所以循环从0开始 并且里面的if顺序很重要 先要判断是否是遇到了这个maj1 maj2 然后再判断 count1 count2是否为零
因为假如这两部分顺序颠倒的话 第一次给maj1初始化成第一个数后 就会把maj2初始化成第二个数 而这两个有可能一样 而if ( nums [i] == maj1 )在前面就可以将相同的先catch住
public class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> res = new ArrayList<Integer>();
if ( nums == null || nums.length == 0 )
return res;
int maj1 = 0;
int maj2 = 1;
int count1 = 0;
int count2 = 0;
for ( int i = 0; i < nums.length; i ++ ){
if ( nums [i] == maj1 ){
count1 ++;
}
else if ( nums [i] == maj2 )
count2 ++;
else if ( count1 == 0 ){
maj1 = nums[i];
count1 ++;
}
else if ( count2 == 0 ){
maj2 = nums[i];
count2 ++;
}
else{
count1 --;
count2 --;
}
}
count1 = 0;
count2 = 0;
for ( int i = 0; i < nums.length; i ++ ){
if ( nums[i] == maj1 )
count1 ++;
if ( nums[i] == maj2 )
count2 ++;
}
if ( count1 > Math.floor(nums.length/3))
res.add( maj1 );
if ( count2 > Math.floor(nums.length/3))
res.add( maj2 );
return res;
}
}