数据结构与算法每日一题——栈和哈希表(347. 前 K 个高频元素)

58 阅读1分钟

347. 前 K 个高频元素

/**
 * @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();

};