每天学习一点算法 2026/04/17
题目:多数元素
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
最容易想到的方法就是利用 Map 统计各个元素出现的次数,某一个元素超过 n/2 就返回这个元素。
typescript
function majorityElement(nums: number[]): number {
const map: Map<number, number> = new Map()
for (let i = 0; i < nums.length; i++) {
const item = nums[i]
if (map.has(item)) {
const count = map.get(item)
map.set(item, count + 1)
if (count + 1 > nums.length / 2) {
return item
}
} else {
map.set(item, 1)
if (nums.length === 1) {
return item
}
}
}
};
我们还可以对数组进行排序那么位于中间的元素一定是众数
typescript
function majorityElement(nums: number[]): number {
return nums.sort()[Math.floor(nums.length / 2)]
};
**进阶:**尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
Boyer-Moore 投票算法
我们遍历数组元素进行两两对比,遇到不同的元素就消耗掉它们,到最后剩下的一定就是众数,因为最差的情况也只能消耗 n / 2 个众。具体实现方法需要维护两个变量,一个是当前候选的众数以及它出现的次数,当次数归零就需要更换候选众数。
typescript
function majorityElement(nums: number[]): number {
let res = nums[0], count = 1 // 初始化候选众数和它出现的次数
// 遍历消耗元素
for (let i = 1; i < nums.length; i++) {
if (nums[i] === res) {
// 遇到相同元素 数量 + 1
count++
} else {
// 遇到不同元素 数量 - 1
count--
if (count === 0) {
// 如果数量归 0 更换候选众数为下一个元素
res = nums[i + 1]
}
}
}
return res
};
题目来源:力扣(LeetCode)