其实有点震惊出这个题,典型的quick select问题,我贡献一个我的代码供参考吧
def findKthLargest(nums, start, end, k):
if start >= end:
return nums[end]
left, right = start, end
pivot = nums[left + (right - left) / 2]
while left <= right:
while left <= right and nums[left] > pivot:
left += 1
while left <= right and nums[right] < pivot:
right -= 1
if left <= right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
if start + k - 1 <= right:
return findKthLargest(nums, start, right, k)
if start + k - 1 >= left:
return findKthLargest(nums, left, end, k - (left - start))
return nums[right + 1]
其实就是典型的快速排序变体而已,while循环中关于pivot的那两个大小于号一改上面这个函数就变成快排了,个人觉得这个很好记忆而且是单独找这种第k大第k小之类问题的最优解了