剑指 Offer 40. (快速选择 & 快速排序)

题目地址(40. 最小的k个数)

https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/

题目描述

输入整数数组 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

思路

关键点

代码

参考:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/jian-zhi-offer-40-zui-xiao-de-k-ge-shu-j-9yze/


class Solution:
    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        # 快速选择
        # 不需要对数组进行完全排序
        # https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/jian-zhi-offer-40-zui-xiao-de-k-ge-shu-j-9yze/
        if k >= len(arr):
            return arr
        def quickSelect(arr, l, r):
            i, j = l, r 
            # 以l为基准
            while i < j:
                while i < j and arr[j] >= arr[l]:
                    j -= 1
                while i < j and arr[i] <= arr[l]:
                    i += 1
                arr[i], arr[j] = arr[j], arr[i]
            
            arr[l], arr[i] = arr[i], arr[l]

            if k < i:
                quickSelect(arr, l, i-1)
            if k > i:
                quickSelect(arr, i+1, r)
            return arr[:k]
            
        return quickSelect(arr, 0, len(arr) - 1)

class Solution(object):
    def getLeastNumbers(self, arr, k):
        """
        :type arr: List[int]
        :type k: int
        :rtype: List[int]
        """
        # 快排
        # https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/solution/jian-zhi-offer-40-zui-xiao-de-k-ge-shu-j-9yze/
        def quickSort(arr, l, r):
            if l >= r:  return
            
            i, j = l, r # 以l为基准
            while i < j:
                while i < j and arr[j] >= arr[l]:
                    j -= 1
                while i < j and arr[i] <= arr[l]:
                    i += 1
                arr[i], arr[j] = arr[j], arr[i]
            
            arr[l], arr[i] = arr[i], arr[l]

            quickSort(arr, l, i - 1)
            quickSort(arr, i + 1, r)

        quickSort(arr, 0, len(arr) - 1)
        return arr[:k] 

复杂度分析

令 n 为数组长度。

  • 时间复杂度:
  • 空间复杂度:
posted @ 2022-04-10 15:32  麦克斯的园丁  阅读(29)  评论(0编辑  收藏  举报