0347._Top_K_Frequent_Elements

0347. Top K Frequent Elements

难度: Medium

刷题内容

原题连接

内容描述

给定一个非空的整数数组,返回其中出现频率前 k 高的元素。

示例 1:

 输入: nums = [1,1,1,2,2,3], k = 2
 输出: [1,2]

示例 2:

 输入: nums = [1], k = 1
 输出: [1]

解题方案

思路 1
**- 时间复杂度: O(N*k)**- 空间复杂度: O(N)**

利用原生的sort方法,

  1. 遍历原有数组,推导出每个数字出现的频率。
  2. 根据出现的频率,利用sort进行排序

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function(nums, k) {
var list = {}
if (nums.length === k) {
return nums
}
while (nums.length) {
var num = nums.pop()
if (list[num]) {
list[num]++
} else {
list[num] = 1
}
}

return Object.keys(list).sort((a, b) => {
return list[b] - list[a]
}).slice(0, k).map(n => Number(n))
};

思路 2
**- 时间复杂度: O(N*k)**- 空间复杂度: O(N)**

自行实现的排序方式

  1. 遍历原有数组,推导出每个数字出现的频率。
  2. 利用快排实现排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
let partion = function(arr, left, right){
let i = left;
let j = right;
let base = arr[left];
while(i<j){
while(arr[j].freq<=base.freq && i<j){
j--;
}
while(arr[i].freq>=base.freq && i<j){
i++;
}
let tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
arr[left] = arr[i];
arr[i] = base;
return i;
}

let quickSort = function(arr, left, right, k){
if(left < right){
let m = partion(arr, left, right);
if(m<k-1){
quickSort(arr, m+1, right, k);
}else if(m>k-1){
quickSort(arr, left, m-1, k);
}
}
}

let Node = function(val, freq){
this.val = val;
this.freq = freq;
}
var topKFrequent = function(nums, k) {
let map = {};
nums.forEach(e=>{
if(map[e]){
map[e].freq += 1;
}else{
map[e] = new Node(e, 1);
}
});
let arr = [];
for(let i in map){
arr.push(map[i]);
}
quickSort(arr, 0, arr.length-1, k);
let res = [];
for(let i=0; i<k; i++){
res.push(arr[i].val);
}
return res;
};