Description
输入整数数组 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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Solution
class Solution:
def getLeastNumbers(self, nums: List[int], k: int) -> List[int]:
def findK(left, right, k):
mid = partition(left, right)
while mid != k:
if mid < k:
mid = partition(mid+1, right)
elif mid > k-1:
mid = partition(left, mid-1)
def partition(left, right):
pivot = nums[left]
while left < right:
while left < right and nums[right] >= pivot: # >=!!!
right -= 1
nums[left] = nums[right]
while left < right and nums[left] <= pivot: # <= !!!
left += 1
nums[right] = nums[left]
nums[left] = pivot
return left
if k == 0: return []
findK(0, len(nums)-1, k-1)
return nums[:k]