给定一个大小为
n
**的数组nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法1 暴力解法
思路
哈希表计数然后再遍历。
代码
function majorityElement(nums: number[]): number {
const map: Record<number, number> = {};
for (let num of nums) {
map[num] = (map[num] || 0) + 1;
}
const times = nums.length / 2;
for (let [k, v] of Object.entries(map)) {
if (v > times) return Number(k);
}
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(n)
解法2 Boyer-Moore 投票法
思路
这个算法的前提是一定要有一个数超过一半。 它把多数元素看作“+1 票”,其他元素看作“-1 票”。我们维护一个“候选人”和“当前得票数”:
初始时候选人为空,票数为 0。
遍历每个元素:
-
如果票数为 0,就把当前元素设为候选人
-
如果当前元素等于候选人,票数 +1
-
否则票数 -1
由于多数元素的数量超过一半,它最终会“幸存下来”。
代码
function majorityElement(nums: number[]): number {
let candidate = nums[0];
let count = 0;
for (let num of nums) {
if (count === 0) {
candidate = num;
}
if (num === candidate) {
count += 1;
} else {
count -= 1;
}
}
return candidate;
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(1)