白菜刷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里头。

 

转载于:https://www.cnblogs.com/sssysukww/p/9554696.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值