[路飞]_程序员必刷力扣题: 面试题 17.14. 最小K个数

126 阅读1分钟

面试题 17.14. 最小K个数

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

提示:

  • 0 <= len(arr) <= 100000
  • 0 <= 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;
    }
}