原文:前 K 个高频元素。 - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/javascript/heap/

题目描述:

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2:

输入: nums = [1], k = 1 输出: [1] 说明:

你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。

解题:

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var topKFrequent = function(nums, k) {
  //存储结果数组
  const results = [];
  /**
   * 构建哈希图
   * 其中
   * 值是频率
   * key是元素
   */
  const map = {};
  nums.forEach(n => {
    return map[n] ? (map[n] = map[n] + 1) : (map[n] = 1);
  });

  /**
   * 根据 频率
   * 对map的key数组进行排序
   */
  //首先获取所有的key
  const mapKey = Object.keys(map);
  const sortedKeys = mapKey
    .sort((a, b) => map[b] - map[a]);

  //取前几个的k的结果
  for (let i = 0; i < k; i++) {
    results.push(sortedKeys[i]);
  }

  return results;
};

扩展阅读: