1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]: if not arr or k == 0: return [] self.partitionK(arr, 0, len(arr)-1, k) return arr[:k]
def partitionK(self, nums, l, r, k): index = self.partition(nums, l, r) length = index - l + 1 # print("index,nums,l,r,k, length",index,nums,l,r,k, length) if k > length: self.partitionK(nums, index+1, r, k-length) if k < length: self.partitionK(nums, l, index-1, k)
def partition(self, nums, l, r): self.swap(nums, l, l+(r-l)//2) # print("partition,nums", nums) pivot = l index = l+1 for i in range(index, r+1): # print('i,index,nums', i,index,nums) if nums[i] < nums[pivot]: self.swap(nums, index, i) index += 1 # print("partition2,nums", nums) self.swap(nums, pivot, index-1) return index-1
def swap(self, nums, i, j): nums[i],nums[j] = nums[j], nums[i]
|