diff --git a/codes/csharp/chapter_heap/top_k.cs b/codes/csharp/chapter_heap/top_k.cs new file mode 100644 index 00000000..84209041 --- /dev/null +++ b/codes/csharp/chapter_heap/top_k.cs @@ -0,0 +1,36 @@ +/** +* File: top_k.cs +* Created Time: 2023-06-14 +* Author: hpstory (hpstory1024@163.com) +*/ + +namespace hello_algo.chapter_heap; + +public class top_k { + /* 基于堆查找数组中最大的 k 个元素 */ + public static PriorityQueue topKHeap(int[] nums, int k) { + PriorityQueue heap = new PriorityQueue(); + // 将数组的前 k 个元素入堆 + for (int i = 0; i < k; i++) { + heap.Enqueue(nums[i], nums[i]); + } + // 从第 k+1 个元素开始,保持堆的长度为 k + for (int i = k; i < nums.Length; i++) { + // 若当前元素大于堆顶元素,则将堆顶元素出堆、当前元素入堆 + if (nums[i] > heap.Peek()) { + heap.Dequeue(); + heap.Enqueue(nums[i], nums[i]); + } + } + return heap; + } + + [Test] + public void Test() { + int[] nums = { 1, 7, 6, 3, 2 }; + int k = 3; + PriorityQueue res = topKHeap(nums, k); + Console.WriteLine("最大的 " + k + " 个元素为"); + PrintUtil.PrintHeap(res); + } +}