返回

揭开 LeetCode 169:破解「多数元素」挑战,JavaScript 轻松取胜

前端

LeetCode,程序员的修行圣地,总有难题横亘在进击的道路上。今天,我们向一道经典题目发起挑战:169. 多数元素。磨刀霍霍,且看 JavaScript 如何斩获佳绩!

算法精解:探寻多数元素的奥秘

什么是多数元素?

多数元素是指在一个数组中出现次数大于该数组元素个数一半的元素。换句话说,对于一个长度为 n 的数组,如果某个元素出现的次数超过 n/2,那么它就是多数元素。

算法思路:

求解多数元素问题,有两种常见算法:

1. 哈希表法

原理:使用哈希表记录数组中每个元素出现的次数,然后遍历哈希表,找出出现次数超过 n/2 的元素。

2. 摩尔投票法

原理:遍历数组,每次遇到一个元素,就将其作为候选多数元素。如果再次遇到该元素,就将其出现次数加 1;如果遇到其他元素,就将其出现次数减 1。当遍历完整个数组时,出现次数大于 0 的元素即为多数元素。

JavaScript 解法:

我们采用摩尔投票法,实现 JavaScript 解决方案如下:

function majorityElement(nums) {
  // 候选多数元素
  let candidate = null;
  // 候选多数元素出现次数
  let count = 0;

  // 遍历数组
  for (const num of nums) {
    // 如果候选多数元素与当前元素相同,则计数加 1
    if (candidate === num) {
      count++;
    // 如果候选多数元素与当前元素不同,则计数减 1
    } else if (count === 0) {
      candidate = num;
      count = 1;
    } else {
      count--;
    }
  }

  // 验证候选多数元素是否确实为多数元素
  count = 0;
  for (const num of nums) {
    if (num === candidate) {
      count++;
    }
  }
  return count > nums.length / 2 ? candidate : -1;
}

优化妙招:提升算法效率

时间复杂度优化:

使用摩尔投票法,时间复杂度为 O(n),其中 n 为数组长度。这是因为算法只需要遍历数组一次。

空间复杂度优化:

哈希表法需要额外的空间来存储哈希表,而摩尔投票法只需要几个变量,因此空间复杂度为 O(1)。

实战演练:一招制敌

示例:

给定数组 nums = [3, 2, 3],找出其中的多数元素。

解法:

const nums = [3, 2, 3];
const majorityElement = (nums) => {
  // 候选多数元素
  let candidate = null;
  // 候选多数元素出现次数
  let count = 0;

  // 遍历数组
  for (const num of nums) {
    // 如果候选多数元素与当前元素相同,则计数加 1
    if (candidate === num) {
      count++;
    // 如果候选多数元素与当前元素不同,则计数减 1
    } else if (count === 0) {
      candidate = num;
      count = 1;
    } else {
      count--;
    }
  }

  // 验证候选多数元素是否确实为多数元素
  count = 0;
  for (const num of nums) {
    if (num === candidate) {
      count++;
    }
  }
  return count > nums.length / 2 ? candidate : -1;
};
console.log(majorityElement(nums)); // 输出:3

结语:化繁为简,从容应对

LeetCode 169 难题的解法看似繁杂,但其核心思想却很简单:找到一个出现次数超过一半的元素。通过摩尔投票法,我们巧妙地避开了复杂的数据结构和算法,用简洁明了的代码高效地解决了问题。在编程修行中,化繁为简的思维方式至关重要,它能让你在面对难题时游刃有余。