给定一个大小为 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;
};