剑指 Offer 40. 最小的k个数

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

方法:快速排序  时间复杂度O(nlogn)  空间复杂度O(n)  

 

def getLeastNumbers(arr, k):
        """
        :type arr: List[int]
        :type k: int
        :rtype: List[int]
        """
        def quick(arr,l,r):
            if k >= len(arr):
                return
            
            i,j = l,r
            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]

            quick(arr,i+1,r)
         quick(arr,l,i-1)
        quick(arr,0,len(arr) - 1)
        return arr[:k]

 

但是该题没有要求最小的k个数是有序的,故可以不用管小于部分的那些值的顺序  做到  时间复杂度O(n)  空间复杂度O(logn)  

对于空间复杂度,其平均遍历的和为 N + N/2 + N/4 + .....为等比数列和  2N  - 1  故时间复杂度为O(n)

def getLeastNumbers(arr, k):
        """
        :type arr: List[int]
        :type k: int
        :rtype: List[int]
        """
        def quick(arr,l,r):
            if k >= len(arr):
                return
            
            i,j = l,r
            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:
                quick(arr,i+1,r)
            if k < i:
                quick(arr,l,i-1)
        quick(arr,0,len(arr) - 1)
        return arr[:k]

 

posted @ 2022-07-29 15:11  Liang-ml  阅读(25)  评论(0)    收藏  举报