面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:
0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))
小顶堆
思路 创建小顶堆,每次从堆顶pop最小的元素,pop执行k次即可
var smallestK = function (arr, k) {
// 思路小顶堆
const heap = new Heap(arr,(l,t)=>l<t)
const res = []
while(k>0){
res.push(heap.pop())
k--
}
return res
};
class Heap {
constructor(data, compare) {
this.data = data
this.compare = compare
for (let i = (data.length >> 1) - 1; i >= 0; i--) {
this.heapify(i);
}
}
heapify(index) {
var target = index;
let left = target * 2 + 1
let right = target * 2 + 2
if (left < this.data.length && this.compare(this.data[left], this.data[target])) {
target = left
}
if (right < this.data.length && this.compare(this.data[right], this.data[target])) {
target = right
}
if (target !== index) {
this.swap(target, index)
this.heapify(target)
}
}
swap(l, r) {
let data = this.data;
[data[l], data[r]] = [data[r], data[l]];
}
pop() {
this.swap(0, this.data.length - 1);
let ret = this.data.pop();
this.heapify(0);
return ret;
}
}