215. 数组中的第K个最大元素
一般来说,直接sort排序,取对应位置元素即可。
但是做算法题不能这样取巧。
但是解题思路是一样的:排序+取值
使用快速排序的方法:
1.初始化一个哨兵元素,遍历所有元素,分为大于该元素,等于该元素,小于该元素的,放在三个数组中
2.检查k是小于等于big的长度,如果是,说明在big数组中,继续递归
3.检查k是否大于big+equal的长度,如果是,说明在small数组中;并且由于已经不在big+equal中了,所以要排除掉前big+equal长度的k,因此要更新k
4.最终返回哨兵元素
class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
# 快速排序
def qs(nums, k):
# 哨兵元素,随机选择
pivot = random.choice(nums)
# 初始化比哨兵元素大、等、小的数组
big, equal, small = [], [], []
# 遍历数组,将元素归类
for num in nums:
if num > pivot:
big.append(num)
elif num < pivot:
small.append(num)
else:
equal.append(num)
# 要求是第k大,我们按哨兵元素分,大的都在Big这,
# 所以如果说k小于big的长度,那肯定就在big里面
# 继续在里面递归找
if k <= len(big):
return qs(big, k)
# 如果k比Big和相等的数组长度大,那就是在小于的数组里面
# k的大小也应该自减
if k > len(big) + len(equal):
return qs(small, k-len(big)-len(equal))
# 找到满足的哨兵元素
return pivot
return qs(nums,k)