排序 时间复杂度 O(nlogn) 空间复杂度 O(logn)
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function (nums) {
nums = nums.sort()
// 排序之后数组中间的数一定是众数(因为题目说数组中的众数大于 ⌊nums.length/2⌋)
return nums.find(item=>item==nums[Math.floor(nums.length/2)])
};
Boyer Moore投票算法 时间复杂度 O(n) 空间复杂度 O(1)
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function (nums) {
// 初始化计数器和数量最多的数
let count = 0;
let candidate = null;
for (let item of nums) {
// 如果计数器归零说明之前数量最多的数被后来最多的数给顶掉了
if (count === 0) {
candidate = item;
}
// 如果当前的数等于当前数量最多的数计数器+1
// 否则-1
if (item === candidate) {
count++;
} else {
count--;
}
}
return candidate;
};