鱼C论坛

 找回密码
 立即注册
查看: 493|回复: 1

大小根堆维护第k大的数跟第k小的数代码

[复制链接]
发表于 2024-1-24 21:52:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大小根堆维护第k大的数跟第k小的数代码怎么写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-24 21:56:17 | 显示全部楼层
维护第k大的数可以使用最小堆(小根堆),维护第k小的数可以使用最大堆(大根堆)。

下面是使用Python实现维护第k大的数和第k小的数的代码示例:
import heapq

def find_kth_largest(nums, k):
    heap = []

    for num in nums:
        heapq.heappush(heap, num)
        if len(heap) > k:
            heapq.heappop(heap)

    return heap[0]

def find_kth_smallest(nums, k):
    heap = []

    for num in nums:
        heapq.heappush(heap, -num)  # 取负数使得最大值成为堆的根节点
        if len(heap) > k:
            heapq.heappop(heap)

    return -heap[0]

# 示例用法
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5]
k = 2

kth_largest = find_kth_largest(nums, k)
print(f"The {k}th largest number is: {kth_largest}")

kth_smallest = find_kth_smallest(nums, k)
print(f"The {k}th smallest number is: {kth_smallest}")

以上代码中,我们使用了`heapq`模块中的`heappush`和`heappop`函数来实现堆的插入和删除操作。对于维护第k大的数,我们使用最小堆,每次插入一个数后,如果堆的大小超过k,则弹出堆顶元素;对于维护第k小的数,我们使用最大堆,每次插入一个数后,如果堆的大小超过k,则弹出堆顶元素。最后返回堆中的根节点即可得到第k大或第k小的数。

以上代码在示例用法中给出了一个具体例子,nums是要统计的数字列表,k是期望找到的第k大或第k小的数。输出分别是第k大和第k小的数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表