返回
JavaScript 摩尔投票法,如何找出数组中的众数?
前端
2023-09-30 10:07:17
背景知识:众数
众数,又称众数、模态,是指在一个数据集中出现次数最多的值。众数可以用于找出数据的中心趋势,以及了解数据分布情况。
摩尔投票法
摩尔投票法是一种用于找出众数的简单而有效的算法。该算法的工作原理是,首先选取一个初始候选数(这个初始候选数可以选择数组中的任何一个数字),然后遍历数组,将每个数字与候选数进行比较。如果当前数字与候选数相同,则将候选数字数加1,否则将候选数字数减1。当遍历完整个数组后,如果候选数字数仍然大于0,则该候选数就是众数。
摩尔投票法的优点是时间复杂度低,仅需要遍历数组一次。然而,摩尔投票法也存在一个缺点,就是当数组中有多个众数时,该算法无法找出所有的众数。
JavaScript 摩尔投票法代码
/**
* 找到数组中的众数
*
* @param {number[]} nums 输入数组
* @return {number} 众数
*/
function findMajorityElement(nums) {
// 候选数字
let candidate = null;
// 候选数字的次数
let count = 0;
// 遍历数组
for (const num of nums) {
// 如果当前数字与候选数字相同,则将候选数字的次数加1
if (num === candidate) {
count++;
} else if (count === 0) {
// 如果候选数字的次数为0,则将当前数字设为候选数字
candidate = num;
count = 1;
} else {
// 如果当前数字与候选数字不同,则将候选数字的次数减1
count--;
}
}
// 返回候选数字
return candidate;
}
LeetCode 229. 众数 II
给定一个包含整数的数组 nums 和一个整数 k,找出并返回数组中出现频率超过 k/3 次的元素。
示例 1:
输入:nums = [3,2,3], k = 2
输出:[3]
示例 2:
输入:nums = [1,2,3,4,5,6,7,8,9,10], k = 3
输出:[1,2,3,4,5,6,7,8,9,10]
分析
根据题目,我们需要找出数组中出现频率超过 k/3 次的元素。因此,我们可以使用摩尔投票法来解决这个问题。
JavaScript 代码
/**
* 找出数组中出现频率超过 k/3 次的元素
*
* @param {number[]} nums 输入数组
* @param {number} k 输入整数
* @return {number[]} 出现频率超过 k/3 次的元素
*/
function findMajorityElements(nums, k) {
// 候选数字
const candidates = [];
// 候选数字的次数
const counts = [];
// 遍历数组
for (const num of nums) {
// 如果候选数字中存在当前数字,则将候选数字的次数加1
if (candidates.includes(num)) {
counts[candidates.indexOf(num)]++;
} else if (candidates.length < k) {
// 如果候选数字的个数小于k,则将当前数字设为候选数字
candidates.push(num);
counts.push(1);
} else {
// 如果候选数字的个数等于k,则将所有候选数字的次数减1
for (let i = 0; i < candidates.length; i++) {
counts[i]--;
}
}
}
// 找出出现频率超过 k/3 次的候选数字
const majorityElements = [];
for (let i = 0; i < candidates.length; i++) {
if (counts[i] > nums.length / k) {
majorityElements.push(candidates[i]);
}
}
// 返回出现频率超过 k/3 次的候选数字
return majorityElements;
}
总结
本文介绍了摩尔投票法,并给出了JavaScript版本的摩尔投票法代码。同时,本文还介绍了如何使用摩尔投票法解决LeetCode 229. 众数 II这道题目。