這裏可使用隨機選擇算法,平均時間複雜度爲 O(n),最差狀況下時間複雜度爲 O(n^2)。另外還可使用更加複雜 BFPRT 算法 好處是平均時間複雜度和最差狀況下時間複雜度都是 O(n)。算法
import random class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: if not arr or k == 0: return [] def partition(l, r): pivot = arr[r] j = l-1 for i in range(l, r): if arr[i] <= pivot: j += 1 arr[i], arr[j] = arr[j], arr[i] arr[j+1], arr[r] = arr[r], arr[j+1] return j+1 def topk(l, r, k): i = random.randint(l, r) arr[r], arr[i] = arr[r], arr[i] m = partition(l, r) if m+1 == k: return if m+1 < k: topk(m+1, r, k) else: topk(l, m-1, k) topk(0, len(arr)-1, k) return arr[:k]