返回

JavaScript 摩尔投票法,如何找出数组中的众数?

前端

背景知识:众数

众数,又称众数、模态,是指在一个数据集中出现次数最多的值。众数可以用于找出数据的中心趋势,以及了解数据分布情况。

摩尔投票法

摩尔投票法是一种用于找出众数的简单而有效的算法。该算法的工作原理是,首先选取一个初始候选数(这个初始候选数可以选择数组中的任何一个数字),然后遍历数组,将每个数字与候选数进行比较。如果当前数字与候选数相同,则将候选数字数加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这道题目。