题目
代码

class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
arr.sort()
return arr[:k]
【方法2-无脑使用api】

class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
return heapq.nsmallest(k,arr)
【方法3】

class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
heapq.heapify(arr)
ans=[]
while k:
ans.append(heappop(arr))
k-=1
return ans
简化版本

class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
heapq.heapify(arr)
return [heappop(arr) for i in range(k)]
【方法4:快速排序】
直接应用快速排序到arr数组之上

class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
def quick_sort(arr, l, r):
# 子数组长度为 1 时终止递归
if l >= r: return
# 哨兵划分操作(以 arr[l] 作为基准数)
i, j = l, r
while i < j:
# print("list:",arr[l:r+1]," 哨兵:",arr[l])
while i < j and arr[j] >= arr[l]: j -= 1
while i < j and arr[i] <= arr[l]: i += 1
# print((i,j))
arr[i], arr[j] = arr[j], arr[i]
arr[l], arr[i] = arr[i], arr[l]
# 递归左(右)子数组执行哨兵划分
quick_sort(arr, l, i - 1)
quick_sort(arr, i + 1, r)
quick_sort(arr, 0, len(arr) - 1)
return arr[:k]
【方法5:借助快速排序的思想进一步简化】

class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
if k >= len(arr): return arr
def quick_sort(l, r):
i, j = l, r
while i < j:
while i < j and arr[j] >= arr[l]: j -= 1
while i < j and arr[i] <= arr[l]: i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[l], arr[i] = arr[i], arr[l]
if k < i: return quick_sort(l, i - 1)
if k > i: return quick_sort(i + 1, r)
return arr[:k]
return quick_sort(0, len(arr) - 1)

本文探讨了四种Python方法实现获取列表中最小k个数:排序、堆队列、快速排序简化版和堆排序。详细介绍了堆数据结构在求解问题中的优势,并对比了它们的时间复杂度和适用场景。
3401

被折叠的 条评论
为什么被折叠?



