hello-algo/codes/javascript/chapter_heap/top_k.js
Justin Tse 5d7e0a59b1
Add JavaScript and TypeScript code of top_k and update some code style (#686)
* Update JS and TS code style

* Add JavaScript and TypeScript code of top_k

* Update top_k.ts

* Apply suggestions from code review

Co-authored-by: Justin Tse <xiefahit@gmail.com>

* Apply suggestions from code review

Co-authored-by: Justin Tse <xiefahit@gmail.com>

---------

Co-authored-by: Yudong Jin <krahets@163.com>
2023-08-17 05:00:35 +08:00

34 lines
1.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* File: top_k.js
* Created Time: 2023-08-13
* Author: Justin (xiefahit@gmail.com)
*/
const { MaxHeap } = require('./my_heap');
/* 基于堆查找数组中最大的 k 个元素 */
function top_k_heap(nums, k) {
// 使用大顶堆 MaxHeap对数组 nums 取相反数
const invertedNums = nums.map(num => -num);
// 将数组的前 k 个元素入堆
const heap = new MaxHeap(invertedNums.slice(0, k));
// 从第 k+1 个元素开始,保持堆的长度为 k
for (let i = k; i < invertedNums.length; i++) {
// 若当前元素小于堆顶元素,则将堆顶元素出堆、当前元素入堆
if (invertedNums[i] < heap.peek()) {
heap.pop();
heap.push(invertedNums[i]);
}
}
// 取出堆中元素
const maxHeap = heap.getMaxHeap();
// 对堆中元素取相反数
const invertedMaxHeap = maxHeap.map(num => -num);
return invertedMaxHeap;
}
/* Driver Code */
const nums = [1, 7, 6, 3, 2];
const k = 3;
const res = top_k_heap(nums, k);
console.log(`最大的 ${k} 个元素为`, res);