📅  最后修改于: 2023-12-03 14:58:30.379000             🧑  作者: Mango
本题为 GATE-CS-2015(套装2)的第 65 题,要求编写一个程序,输入为一个整数列表和一个正整数 k,输出为列表中的前 k 个最大数。
本题要求找出列表中前 k 个最大数,可以借助堆这一数据结构来实现。我们可以先将列表中的前 k 个数构建成一个大小为 k 的小根堆,然后遍历列表中剩余的数,如果当前数大于堆顶元素,则将其加入到堆中,同时弹出堆顶元素,以此保持堆大小不变,最终堆中的元素即为列表中前 k 个最大数。
关于堆的具体实现可以使用 Python 中的 heapq 模块,该模块提供了堆的相关操作函数,使用比较方便。
import heapq
def k_largest(lst, k):
"""
寻找列表中的前 k 个最大数
:param lst: 整数列表
:param k: 正整数
:return: 前 k 个最大数构成的列表
"""
heap = lst[:k]
heapq.heapify(heap)
for num in lst[k:]:
if num > heap[0]:
heapq.heappushpop(heap, num)
return heap
>>> lst = [3, 5, 2, 8, 4, 7]
>>> k_largest(lst, 3)
[5, 7, 8]
>>> k_largest(lst, 2)
[7, 8]