使用 JavaScript 刷题,最大的缺陷就是没有优先队列/堆这个数据结构。不过,LeetCode 引入了 datastructures-js/priority-queue 库,可以使用。
库介绍
LeetCode 编辑器语言选择 JavaScript,它旁边有提示图标,点击看到,如需使用优先队列,可使用 datastructures-js/priority-queue@5.3.0
。
这个库实现了最大堆、最小堆,以及自行指定优先规则回调的优先队列。
安装
https://www.npmjs.com/package/@datastructures-js/priority-queue
npm i -D @datastructures-js/priority-queue@5.3.0
安装后就可以本地调试了,本地需要从库中引入类。因为该库支持 TS,在编辑器中会有较好的提示。
使用方法: https://github.com/datastructures-js/priority-queue/tree/v5.3.0
使用
在答题时,使用时,不需要引入,直接用即可。
提供类: PriorityQueue
构造函数:传入对象,通过 compare 对象传入比较函数。
如创建大根堆与小根堆,其中 compare 与 sort 的一样,传入 a - b
或 a > b ? 1 : -1
是从小到大,为小根堆,反之 b - a
为大根堆:
const pq = new PriorityQueue({compare: (a, b) => a - b}) // 小根堆
const pq = new PriorityQueue({compare: (a, b) => b - a}) // 大根堆
常用方法:
- enqueue(x) 入队 / dequeue() 出队并返回元素
- size() 返回长度
- front() 返回优先级最高的元素
- clear() 清空
尝试使用其处理堆的经典题目, leetcode 215. 数组中的第K个最大元素:
var findKthLargest = function (nums, k) {
const pq = new PriorityQueue({compare: (a, b) => a - b})
for (let i = 0; i < nums.length; i++) {
pq.enqueue(nums[i])
if (pq.size() > k) pq.dequeue()
}
return pq.front()
};