给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
提示:
- 1 <= nums.length <= 10^5
- k 的取值范围是 [1, 数组中不相同的元素的个数]
- 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的
进阶:你所设计算法的时间复杂度 必须 优于 O(n log n) ,其中 n 是数组大小。
解题思路
1.首先新建一个Map对象,然后使用循环对元素的频率进行统计
2.接着将字典转成数组,然后对数组中的第二个元素(频度)从小到大排序
3.最后截取频率前k高的元素返回即可
代码
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function(nums, k) {
const map = new Map()
nums.forEach(n => {
map.set(n, map.has(n) ? map.get(n)+1 : 1)
})
// 首先将字典转成数组,然后对数组中的第二个元素(频度)从小到大排序
const list = Array.from(map).sort((a, b) => b[1] - a[1])
// 截取频率前k高的元素
return list.slice(0, k).map(n => n[0])
};