给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

输入: [3,2,3] 输出: [3] 示例 2:

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

/**
 * 摩尔投票升级
 * 超过n/3的数只会出现 0 或者 1 或者 2 个
 * @param {number[]} nums
 * @return {number[]}
 */
var majorityElement = function(nums) {
    var man1 = nums[0],
        count1 = 0,
        man2 = nums[0],
        count2 = 0,
        len = nums.length,
        result = [];
    for(var i = 0; i < len; i++){
        if(nums[i] == man1){
            count1++;
            continue;
        }
        if(nums[i] == man2){
            count2++;
            continue;
        }
        if(count1 == 0){
            man1 = nums[i];
            count1++;
            continue;
        }
        if(count2 == 0){
            man2 = nums[i];
            count2++;
            continue;
        }
        count1--;
        count2--;
    }
    //此时得到是man1和man2都只是有可能成为众数
    count1 = 0;
    count2 = 0;
    for(num of nums){
        if(num == man1){
            count1++;
        }else if(num == man2){
            count2++;
        }
    }
    count1 > Math.floor(len/3) ? result.push(man1) : '';
    count2 > Math.floor(len/3) ? result.push(man2) : '';
    return result;
};