第五题,开始刷中等难度的题目,题目如下:
按照题目,要求找出输入数组中前k个出险频率最高的数字,同时要求时间复杂度要比 O(n log n) 好。
这题的难度主要是限定了时间的复杂度,这样的话,想到一个使用Map的方法,但是Map方法也需要对数组遍历一次,时间复杂度 O(n) 是否比 O(n log n) 好呢?
下面贴出时间复杂度的排序(来源于《数据结构与算法经典问题解析》):
OK,是可以使用这种方法的。
1 /** 2 * @param {number[]} nums 3 * @param {number} k 4 * @return {number[]} 5 */ 6 var topKFrequent = function(nums, k) { 7 var myMap = new Map(); 8 var res = new Array(); 9 var resnum = new Array(); 10 11 for(let i = 0 ; i < nums.length; i++){ 12 if(myMap.get(nums[i]) == undefined){ 13 myMap.set(nums[i],1); 14 }else{ 15 myMap.set(nums[i], myMap.get(nums[i]) + 1); 16 } 17 } 18 19 res = Array.from(myMap); 20 21 res.sort((a, b) => b[1] - a[1]); 22 23 for(let i = 0 ; i < k ; i++){ 24 resnum.push(res[i][0]); 25 } 26 27 return resnum; 28 29 };
这道题个人花时间比较长,主要原因还是对JavaScript库里头的数据结构方法的不熟练吧,例如在这道题之前,自己是不知道如何将Map转化为 Array的,通过查找 MDN,得知 Map.from 是可以做到将Map内容复制到Array里头。