**LeetCode-Majority Element II

第一个题保证了一定有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;
    }
}



你可能感兴趣的:(**LeetCode-Majority Element II)