题目链接
题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组[1, 2, 3, 2, 2, 2, 5, 4, 2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
限制:
- 1 <= 数组长度 <= 50000
- 注意:本题与主站 169 题相同:leetcode-cn.com/problems/ma…
题解
Boyer-Moore 摩尔投票算法
算法复杂度分析
- 时间复杂度:O(n)。Boyer-Moore 算法只对数组进行了一次遍历。
- 空间复杂度:O(1)。Boyer-Moore 算法只需要常数级别的额外空间。
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let res = 0, count = 0;
for(let num of nums) {
if (!count) {
res = num;
count++;
} else {
count += num === res ? 1 : -1
}
}
return res;
};
哈希表
算法复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
/**
* @param {number[]} nums
* @return {number}
*/
var majorityElement = function(nums) {
let mid = nums.length >> 1;
let countMap = {};
for(let num of nums){
const numCount = !countMap[num] ? 1 : countMap[num] + 1;
if (numCount > mid) {
return num;
}
countMap[num] = numCount;
}
};
// 第二种
var majorityElement = function(nums) {
if(!nums||!nums.length){
return null;
}
let map = new Map();
for(let i = 0;i<nums.length;i++){
let cur = nums[i];
if(map.has(cur)){
map.set(cur,map.get(cur) + 1);
} else {
map.set(cur,1);
}
}
let mid = nums.length >> 1;
for( [key,value] of map){
if(value > mid){
return key;
}
}
};