剑指 Offer 40. 最小的k个数

题目链接

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

示例:

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

思路

解法一:

快排法

class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        self.quick_sort(arr, 0, len(arr) - 1)
        return arr[:k]

    def quick_sort(self, nums,left, right):
        if left > right: return
        mid = self.partion(nums, left, right)
        self.quick_sort(nums, left, mid - 1)
        self.quick_sort(nums, mid + 1, right)

    def partion(self, nums, left, right):
        index = random.randint(left, right)
        pivot = nums[index]
        nums[index], nums[left] = nums[left], nums[index]
        i, j = left, right
        while i < j:
            while i < j and nums[j] >= pivot: j -= 1
            while i < j and nums[i] <= pivot: i += 1
            nums[i], nums[j] = nums[j], nums[i]
        nums[i], nums[left] = nums[left], nums[i]
        return i