剑指 Offer II 061. 和最小的 k 个数对
- 插入: 从完全二叉树末尾插入元素,通过 上浮 找到对应的位置
var kSmallestPairs = function (nums1, nums2, k) {
const n = nums1.length;
const m = nums2.length;
let sum;
let maxHeap = new MaxHeap(k);
for (let i = 0; i < k && i < n; i++) {
for (let j = 0; j < k && j < m; j++) {
sum = nums1[i] + nums2[j];
maxHeap.insert([sum, nums1[i], nums2[j]]);
}
}
const result = [];
for (let i = 1; i <= maxHeap.size; i++) {
result.push([maxHeap.data[i][1], maxHeap.data[i][2]])
}
return result;
};
class MaxHeap {
constructor(k) {
this.maxSize = k;
this.size = 0
this.data = [null]
}
insert(arr) {
var i = ++this.size;
while (i > 1 && this.data[i >> 1][0] < arr[0]) {
var j = i >> 1
this.data[i] = this.data[j];
i = j
}
this.data[i] = arr;
if (this.size > this.maxSize) this.delete();
}
delete() {
if (this.size < 1) return false;
const saveItem = this.data[1];
const temp = this.data.pop();
this.size--;
let parent = 1;
while (parent * 2 <= this.size) {
let child = parent * 2;
if (child != this.size && this.data[child][0] < this.data[child + 1][0]) child++;
if (temp[0] >= this.data[child][0]) break;
else this.data[parent] = this.data[child];
parent = child
}
this.data[parent] = temp;
return saveItem;
}
}
var nums1 = [1, 7, 11], nums2 = [2, 4, 6], k = 7
console.log(kSmallestPairs(nums1, nums2, k))