973. 最接近原点的 K 个点
var kClosest = function (points, k) {
const heap = new Maxheap() // 最大堆:按点的平方距离比较
for (let point of points) {
heap.insert(point)
if (heap.size() > k) {
heap.pop() // 超容量,踢掉最远的(堆顶)
}
}
return heap.heap // 堆里剩的就是最近的 K 个
}
class Maxheap {
constructor() {
this.heap = []
}
parentIndex(index) {
return (index - 1) >> 1
}
leftIndex(index) {
return index * 2 + 1
}
rightIndex(index) {
return index * 2 + 2
}
dist([x, y]) {
return x * x + y * y
}
swap(x, y) {
[this.heap[x], this.heap[y]] = [this.heap[y], this.heap[x]]
}
needChange(x, y) {
return this.dist(this.heap[x]) < this.dist(this.heap[y])
}
size() {
return this.heap.length
}
insert(point) {
this.heap.push(point)
this.shiftUp(this.size() - 1)
}
pop() {
this.heap[0] = this.heap.pop()
this.shiftDown(0)
}
shiftUp(index) {
if (index === 0) return
let pi = this.parentIndex(index)
if (this.needChange(pi, index)) {
this.swap(pi, index)
this.shiftUp(pi)
}
}
shiftDown(index) {
let li = this.leftIndex(index)
let ri = this.rightIndex(index)
if (li < this.size() && this.needChange(index, li)) {
this.swap(index, li)
this.shiftDown(li)
}
if (ri < this.size() &&this.needChange(index, ri)) {
this.swap(index, ri)
this.shiftDown(ri)
}
}
}
621. 任务调度器
295. 数据流的中位数
23. 合并 K 个升序链表
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode[]} lists
* @return {ListNode}
*/
merge = (l1, l2) => {
const dummy = new ListNode()
let p = dummy
while(l1&&l2){
if(l1.val < l2.val) {
p.next = l1
l1= l1.next
}else {
p.next = l2
l2 = l2.next
}
p = p.next
}
p.next = l1 || l2
return dummy.next
}
var mergeKLists = function (lists) {
let len = lists.length
if(len === 0) return null
for(let interval = 1; interval < len; interval*=2) {
for(let i = 0; i < len -interval; i += interval*2) {
lists[i] = merge(lists[i], lists[i+interval])
}
}
return lists[0]
};
相关笔记