面試題40. 最小的k個數

面試題40. 最小的k個數面試

這裏可使用隨機選擇算法,平均時間複雜度爲 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]
相關文章
相關標籤/搜索