白菜刷LeetCode记-347. Top K Frequent Elements

第五题,开始刷中等难度的题目,题目如下:

按照题目,要求找出输入数组中前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里头。

猜你喜欢

转载自www.cnblogs.com/sssysukww/p/9554696.html