leetcode 169

103 阅读1分钟
public int majorityElement(int[] nums) {
       return getMajority(nums,0,nums.length-1);
    }

    private int getMajority(int[] nums,int left,int right){
    
        //递归到nums序列只有一个元素时返回
        if(left == right){
            return nums[left];
        }
        
        //对半递归,分而冶之,并返回给leftMajor,rightMajor
        
        int mid = (left + right)/2;
        int leftMajor = getMajority(nums,left,mid);
        int rightMajor = getMajority(nums,mid+1,right);

        if(leftMajor == rightMajor){
            return leftMajor;
        }

        // 有疑惑的是如果最后一次N返回的leftMajor,rightMajor返回的数跟n-1次不一样,那for循环判断逻辑是不是有问题
        int leftCount = 0;
        int rightCount = 0;

        for(int i = left; i<= right; i++ ){
            if(nums[i] == leftMajor){
                leftCount++;
            }else if(nums[i] == rightMajor){
                rightCount++;
            }
        }

        return leftCount > rightCount ? leftMajor : rightMajor;

    }
}