数组中第k个最大元素,最简单的做法就是先给数组排序然后寻找倒数第k个最大元素,但为进一步降低算法的时间复杂度,可以采用快速查找的方法确定元素,即采用快速排序的“哨兵划分”和递归思想。
示例:
图1 输入输出示例图
方法一:
排序后取元素
class Solution:
def findKthLargest(self, nums, k):
nums.sort()
return nums[len(nums) - k]
方法二:
快速查找
class Solution:
def findKthLargest(self, nums, k):
def quickSelect(nums, k):
small, equal, big = [], [], []
pivot = random.choice(nums)
for num in nums:
if num < pivot:
small.append(num)
elif num > pivot:
big.append(num)
else:
equal.append(num)
if k <= len(big):
return quickSelect(big, k)
elif k > len(nums) - len(small):
return quickSelect(small, k + len(small) - len(nums))
return pivot
return quickSelect(nums, k)
解释:
1)pivot即为哨兵,将数组中>、<、=哨兵的元素存储到三个数组中,通过判断第k大元素落在哪个数组确定快速查找递归的下一个数组是谁。
2)着重注意对k的判断以及递归中的k值即可。
if k <= len(big):
return quickSelect(big, k)
elif k > len(nums) - len(small):
return quickSelect(small, k + len(small) - len(nums))