LeetCode 数组与 TopK 刷题笔记

LeetCode 数组与 TopK 刷题笔记

目录:LeetCode 索引

1 最小的 k 个数 面试题 17.14

设计一个算法,找出数组中最小的 k 个数。以任意顺序返回这 k 个数均可。

  • 输入 arr = [1,3,5,7,2,4,6,8], k = 4 → 输出 [1,2,3,4]

思路

快速划分(Quick Select):借鉴快速排序的 partition。时间复杂度平均 O(n),比全局排序(O(n log n))更优。

Python 版

class Solution: # 对数组分区,将数组最右边元素作为基准 pivot # 将小于 pivot 的元素放到左边,大于 pivot 的放到右边 def partition(self, arr: List[int], low: int, high: int): pivot = arr[high] pivot_index = low for i in range(low + 1, high + 1): if arr[i] > pivot: arr[i], arr[pivot_index] = arr[pivot_index], arr[i] pivot_index += 1 arr[high], arr[pivot_index] = arr[pivot_index], arr[high] return pivot_index def smallestK(self, arr: List[int], k: int) -> List[int]: if not isinstance(arr, list): return [] high = len(arr) - 1 if high <= k: return arr pivot_index = self.partition(arr, 0, high) while(pivot_index != k): if pivot_index > k: pivot_index = self.partition(arr[0:pivot_index], 0, pivot_index - 1) elif pivot_index < k: pivot_index += 1 return arr[0:pivot_index+1]

说明:partition 返回基准元素的最终下标;下标小于 k 说明左侧元素不够 k 个,向右边扩大;大于 k 则继续在左侧划分,直到基准下标等于 k,此时 arr[0:k] 即最小的 k 个数。

阅读 — · 全站 —
🎸 我的歌单 0 首