news 2026/8/26 17:26:38

Python 第k个最小元素(K’th Smallest Element)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 第k个最小元素(K’th Smallest Element)

目录

【朴素方法】使用排序——时间复杂度为 O(n log(n)),空间复杂度为 O(1)

【预期方法】使用最大堆 - 时间复杂度为 O(n * log(k)),空间复杂度为 O(k)

【替代方案 1】使用快速选择

【替代方案 2】使用计数排序


如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

给定一个整数数组arr[]和元素个数k,求数组中第 k 小的元素。
注意:k 始终小于数组的大小。

例如:

输入:arr[] = [10, 5, 4, 3, 48, 6, 2, 33, 53, 10], k = 4

输出:5

说明:给定数组中第四小的元素是 5。

输入:arr[] = [7, 10, 4, 3, 20, 15], k = 3

输出:7

说明:给定数组中第三小的元素是 7。

【朴素方法】使用排序——时间复杂度为 O(n log(n)),空间复杂度为 O(1)

其思路是对给定的数组进行排序,并返回索引 k - 1 处的元素。

def kthSmallest(arr, k):

# Sort the given vector
arr.sort()

# Return k'th element in the sorted vector
return arr[k - 1]


if __name__ == "__main__":
arr = [10, 5, 4, 3, 48, 6, 2, 33, 53, 10]
k = 4

print(kthSmallest(arr, k))

输出
5

【预期方法】使用最大堆 - 时间复杂度为 O(n * log(k)),空间复杂度为 O(k)

其思路是在遍历数组的过程中维护一个大小为 k 的最大堆。该堆始终包含目前为止遇到的 k 个最小元素。如果堆的大小超过 k,则移除最大的元素。最终,堆中只保留 k 个最小元素。

import heapq

def kthSmallest(arr, k):

# Create a max heap
pq = []

# Iterate through the array elements
for i in range(len(arr)):

# Push the current element onto the max heap
heapq.heappush(pq, -arr[i])

# If the size of the max heap exceeds k,
#remove the largest element
if len(pq) > k:
heapq.heappop(pq)

return -pq[0]

if __name__ == '__main__':
arr = [10, 5, 4, 3, 48, 6, 2, 33, 53, 10]
k = 4

print(kthSmallest(arr, k))

输出
5

【替代方案 1】使用快速选择

主要思路是利用快速选择(QuickSelect)函数找到第 k 大元素。具体做法是:选择一个基准元素,然后将数组分割成多个部分,使得大于基准元素的元素位于左侧,小于基准元素的元素位于右侧。如果基准元素最终位于索引 k-1 处,则该元素即为第 k 大元素。否则,我们递归地仅在包含第 k 大元素的左侧或右侧部分进行搜索。

def partition(arr, left, right):

# Choose the last element as pivot
pivot = arr[right]
i = left

# Traverse the array and move elements <= pivot to the left
for j in range(left, right):
if arr[j] <= pivot:

# Swap current element with element at i
arr[i], arr[j] = arr[j], arr[i]
i += 1

# Place the pivot in its correct position
arr[i], arr[right] = arr[right], arr[i]
return i

# QuickSelect function: recursively finds k-th smallest
def quickSelect(arr, left, right, k):

if left <= right:

# Partition around pivot
pivotIndex = partition(arr, left, right)

# Found k-th smallest
if pivotIndex == k:
return arr[pivotIndex]

elif pivotIndex > k:
return quickSelect(arr, left, pivotIndex - 1, k)

else:
return quickSelect(arr, pivotIndex + 1, right, k)
return -1

def kthSmallest(arr, k):
return quickSelect(arr, 0, len(arr) - 1, k - 1)

if __name__ == "__main__":
arr = [10, 5, 4, 3, 48, 6, 2, 33, 53, 10]
k = 4
print(kthSmallest(arr, k))

输出
5

时间复杂度: 最坏情况下为O(n² ),但平均时间为 O(n log n),且性能优于基于优先级队列的算法。

辅助空间: 最坏情况下递归调用栈为 O(n)。平均而言:O(log n)。

【替代方案 2】使用计数排序

主要思路是利用计数排序的频率计数来跟踪有多少元素小于或等于每个值,然后直接从这些累积计数中识别出第 K 小的元素,而无需对数组进行完全排序。

注意:这种方法在元素范围较小时特别有效,因为我们声明的数组大小为最大元素个数。如果元素范围非常大,计数排序方法可能并非最有效的选择。

def kthSmallest(arr, k):

# First, find the maximum element in the list
maxElement = arr[0]
for i in range(1, len(arr)):
if arr[i] > maxElement:
maxElement = arr[i]

# Create a frequency array for each element
freq = [0] * (maxElement + 1)
for i in range(len(arr)):
freq[arr[i]] += 1

# Keep track of cumulative frequency to find k-th smallest
count = 0
for i in range(maxElement + 1):
if freq[i] != 0:
count += freq[i]
if count >= k:

# If we have seen k or more elements,
# return the current element
return i
return -1

if __name__ == "__main__":
arr = [10, 5, 4, 3, 48, 6, 2, 33, 53, 10]
k = 4
print(kthSmallest(arr, k))

输出
5

时间复杂度: O(n + maxElement),其中 maxElement 为数组中的最大元素。

辅助空间: O(maxElement)。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 17:25:24

抖音星图平台:达人接单报价与抽成规则揭秘

抖音星图平台&#xff1a;达人接单报价与抽成规则揭秘 在当今新媒体蓬勃发展的时代&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;吸引了无数创作者和品牌方的目光。抖音星图平台作为连接达人与品牌方的重要桥梁&#xff0c;在达人接单合作中扮演着关键角色&#xff0c;其…

作者头像 李华
网站建设 2026/8/26 17:21:44

林伽一 · AI科技研报 | 2026年08月第3周

本文帮你解决三个具体问题&#xff1a;第一&#xff0c;本周智能体技术密集发布&#xff08;NVIDIA AVO、Agent Lightning、Mistral Agentic Search、Cursor Cloud Agents、Anthropic 生产智能体 GA&#xff09;&#xff0c;这些能力的工程本质是什么、哪些可以落地复现&#x…

作者头像 李华
网站建设 2026/8/26 17:10:49

ms-swift零基础学习教材

ms-swift 零基础学习教材&#xff1a;从推理到 LoRA 微调与部署 适合刚开始学习 AI 和编程的。你不需要一次看懂全部内容&#xff0c;也不需要死记参数。 第一次只完成“第 0 关 → 第 1 关 → 第 2 关”&#xff1b;成功后再学习自定义数据和参数调节。 本文依据 2026 年 8 月…

作者头像 李华
网站建设 2026/8/26 17:10:04

从零拿捏Linux(一) ---- 命令(视频秒解)

&#x1f31f;作者介绍&#xff1a;友友们好我是钓鱼的猫猫&#xff0c;可以叫我小猫&#x1f495; ⏳作者主页&#xff1a;钓鱼的猫猫-CSDN博客&#x1f389; &#x1f440;项目专栏&#xff1a;linux_钓鱼的小小猫的博客-CSDN博客 &#x1f389;Gitee&#xff1a;袁浩然 (rai…

作者头像 李华
网站建设 2026/8/26 17:08:20

基于SpringBoot2+vue2的学生宿舍信息的系统

1. Base64 编码工具 获取代码 2. 项目简介 学生宿舍信息系统旨在为高校宿舍管理提供一套线上解决方案&#xff0c;涵盖了宿舍信息管理、学生信息管理、宿舍分配、在线报修、卫生检查、缴费管理、桶装水预订、失物招领与公告发布等多个核心功能模块。 系统支持四种角色&#x…

作者头像 李华