/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function (nums, k) {
// 将哈希表转成数组,用sort方法排序再截取前k个key
// 方法一: 将哈希表转成数组,用sort方法排序再截取前k个key
// 方法二: 桶排序,将频率一致的放在同一个桶里,数组下标i放置频率为i的key,最后倒序取出k个key
// 因为可以按任意顺序返回答案,所以k如果等于map.size,那么直接返回全部key,不用排序
// 这两种都挺快的,但是sort时间复杂度为为O(nlogn),不符合题意,第二种最好的时间复杂度接近O(n)
// //法一:哈希表+sort
let map = new Map();
for (let num of nums) {
map.set(num, map.has(num) ? map.get(num) + 1 : 1);//初始化出现次数为1,之后累加
}
if (k === map.size) return [...map.keys()];//k如果等于map.size,直接返回全部key
// Array.from() 转换完了之后0>>['a',2]
let arr = Array.from(map).sort((a, b) => { return b[1] - a[1] });//从大到小排序
return arr.slice(0, k).map(n => n[0])//截取前k个key
// //法二:哈希表+桶排序
// let map = new Map();
// for(let num of nums) {
// map.set(num, map.has(num) ? map.get(num) + 1 : 1);//初始化出现次数为1,之后累加
// }
// if(k === map.size) return [...map.keys()];//k如果等于map.size,直接返回全部key
// const bucketSort = () => {
// let arr = [];
// let res = [];
// map.forEach((value, key) => {//arr[i]存放频率为i的key数组
// if(!arr[value]) arr[value] = [key];
// else arr[value].push(key);
// });
// for(let i = arr.length - 1; i >= 0 && res.length < k; i--) {
// if(arr[i]) {
// res.push(...arr[i]);//将数组转换为用逗号分割的参数序列
// }
// }
// return res;
// }
// return bucketSort();
};