剑指offer 面试题40. 最小的k个数(python3)

类似题 参考leetcode 215
面试题40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

限制:
0 <= k <= arr. length <= 10000
0 <= arr[i] <= 10000

第一种思路:先排序 然后取前K个 ,
时间复杂度为 O(nlogn)

第二种思路:利用快排的分区思想,然后再判断。
时间复杂度O(n)

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        if not arr:
            return None
        if k == 0:
            return []
        low , high = 0 , len(arr)-1
        while True:
            pos = self.partition(arr,low,high)
            if pos == k-1:
                return arr[:k]
            elif pos > k-1:
                high = pos - 1
            else:
                low = pos + 1
    def partition(self,arr,low,high):
        pivot = arr[low]
        while low < high:
            while low < high and pivot <= arr[high]:
                high -= 1
            arr[low] = arr[high]
            while low < high and arr[low] < pivot:
                low += 1
            arr[high] = arr[low]
        arr[low] = pivot
        return low

第三种思路:堆
后续思路 加进去

你可能感兴趣的:(剑指offer)