题目地址:链接
思路: 堆实现
class MaxHeap_{
heap: [number, number][];
size: number;
constructor(map: Map<number, number>) {
this.heap = [];
this.size = 0;
this.build(map);
}
private build(map: Map<number, number>): void {
map.forEach((val, key) => {
this.heap.push([key, val]);
})
this.size = this.heap.length;
const parentNode = Math.floor((this.size - 1) / 2);
for(let i = parentNode; i >= 0; i --) {
this.sink(i);
}
}
private sink(index: number): void {
let [heap, size] = [this.heap, this.size];
let maxIdx = index;
let leftNode = 2 * index + 1;
let rightNode= 2 * index + 2;
if(leftNode < size && heap[maxIdx][1] < heap[leftNode][1]) {
maxIdx = leftNode;
}
if(rightNode < size && heap[maxIdx][1] < heap[rightNode][1]) {
maxIdx = rightNode;
}
if(index !== maxIdx) {
[heap[maxIdx], heap[index]] = [heap[index], heap[maxIdx]];
this.sink(maxIdx);
}
}
public pop(): number {
let heap = this.heap;
let ans = this.getTop();
heap[0] = heap[this.size - 1];
this.size --;
this.sink(0);
return ans;
}
private getTop(): number {
return this.heap[0][0];
}
}
function topKFrequent(nums: number[], k: number): number[] {
let map = new Map();
for(const num of nums) {
map.set(num, (map.get(num) ?? 0) + 1);
}
const maxheap = new MaxHeap_(map);
let ans:number[] = [];
for(let i = 0; i < k; i ++) {
let idx = maxheap.pop();
ans.push(idx);
}
return ans;
};
8万+

被折叠的 条评论
为什么被折叠?



