剑指 Offer 39. 数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

 

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

 

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2

class Solution {
    public int majorityElement(int[] nums) {
        //数组中一个数字超过一半,对出现的数字统计票数,数字不同进行抵消,票数一定大于0,一定会找到众数
        //比如
        //1, 2, 3, 2, 2, 2, 5, 4, 2
        //+  -  +  -  +  +  -  +  -
        int val = 0;//用来记录众数
        int count = 0;//票数用来记录相同数量出现的次数
        for(int num : nums) {
            //当前数字等于众数 count++
            //当前数字不等于众数 count--
            //count=0,更新val,count++,最后肯定有count>=1
            if(num == val) {
                count++;
            }else{
                if(count>=1) count--;
                if(count==0) {
                    val = num;
                    count++;
                }
            }
        }
        return val;
    }
}

 

你可能感兴趣的:(剑指offer)