剑指 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]

浙公网安备 33010602011771号