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
| class Solution: def partition(self, nums, left, right): pivot = left index = left + 1 for i in range(index, right+1): # print('left,right,i', left, right, i) if nums[i] > nums[pivot]: self.swap(nums, i, index) index += 1 self.swap(nums, pivot, index-1) return index-1 def swap(self, nums, i, j): nums[i],nums[j] = nums[j], nums[i] def partitionK(self, nums, left, right, k): index = self.partition(nums, left, right) length = index-left+1 # 如果已划分的个数length大于需要找的数k, 则在index左半部分重新找k个数 if length > k: self.partitionK(nums, left, index-1, k) # 如果已划分的个数length小于需要找的数k, 则在index右半部分再找k-length个数即可 if length < k: self.partitionK(nums, index+1, right, k-length)
def findKthLargest(self, nums: List[int], k: int) -> int: self.partitionK(nums, 0, len(nums)-1, k) return nums[k-1]
|