返回

LeetCode题解:347. 前 K 个高频元素,二叉堆,JavaScript,详细注释

前端

  1. 前 K 个高频元素:二叉堆与 JavaScript 代码指南

在这个LeetCode的347题中,我们面临的挑战是找出数组中出现频率最高的前K个元素。为了解决这个问题,我们将使用二叉堆,它是一种数据结构,能够快速插入和取出元素,并始终能够按要求排序。

/*
 * 解题思路:
 * 1. 创建一个大顶堆,元素按照出现的频次由大到小排序。
 * 2. 遍历数组,统计所有元素出现的频次。
 * 3. 将频次与元素一起存入堆中,所有元素都插入之后,都已按照要求排序。
 * 4. 从堆中取出k次堆顶元素并返回,每次取出后堆还会重新排序。
 */

// 定义二叉堆的比较函数
const compareFunction = (a, b) => {
  return b.count - a.count;
};

// 定义二叉堆
const heap = [];

// 定义哈希表,记录元素出现的频次
const hash = {};

// 遍历数组,统计每个元素出现的频次并存入哈希表
const arr = [1, 1, 1, 2, 2, 3];
arr.forEach((element) => {
  if (hash[element]) {
    hash[element]++;
  } else {
    hash[element] = 1;
  }
});

// 将哈希表中的元素和频次存入堆中
for (const element in hash) {
  heap.push({ element, count: hash[element] });
}

// 使用二叉堆排序,让元素按照频次由大到小排序
heap.sort(compareFunction);

// 从堆中取出k次堆顶元素并返回
const result = [];
for (let i = 0; i < 2; i++) {
  result.push(heap.pop().element);
}

console.log(result); // 输出:[1, 2]

我们首先创建了一个大顶堆,按照元素的频次由大到小进行排序。然后遍历数组,统计所有元素出现的频次,并将这些频次与元素一起存入堆中。此时,堆已经按照要求排好了序。接着,我们从堆中取出前K个元素并返回,每次取出后堆还会重新排序,确保始终保持排序。

希望这个详细的题解和代码能够帮助你更好地理解如何使用二叉堆来解决这个问题。