鱼C论坛

 找回密码
 立即注册
查看: 192|回复: 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小的数的代码示例:

  1. import heapq

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

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

  8.     return heap[0]

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

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

  15.     return -heap[0]

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

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

  21. kth_smallest = find_kth_smallest(nums, k)
  22. 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-4-28 17:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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