215. Kth Largest Element in an Array
快速选择算法,和快排是同一个作者。
- 选择一个轴点,将比其大的放在前面,比其小的放在后面,则中轴点为第 index + 1 小;
- 判断 index 和 k 的关系,从而决定在前半段寻找第 k 大还是后半段;
- 细节见代码
class Solution(object):
def findKthLargest(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
if len(nums) == 0:
return None
elif len(nums) == 1:
return nums[0]
piovt = 0
i = 0 # 从 0 开始 而不是 1
j = len(nums) - 1
num = nums[:]
while i < j:
# 因为最后要交换 pivot 和 最终 i/j 的位置,所以
# 必须保证 i/j 的停止点元素是大于 pivot 的,所以
# 应先 j 后 i
while i < j and num[j] <= num[piovt]:
j -= 1
while i < j and num[i] >= num[piovt]:
i += 1
t = num[i]
num[i] = num[j]
num[j] = t
t = num[i]
num[i] = num[piovt]
num[piovt] = t
piovt = i
# 递归判断,注意 pivot + 1 和 k 进行比较
# 另外 list[0:2] 是 [l[0], l[1]],不包括 l[2]
# 同时 l[0:-1] 不包括最后一个元素
if piovt + 1 == k:
return num[piovt]
elif piovt + 1 > k:
return self.findKthLargest(num[0:piovt], k)
else:
return self.findKthLargest(num[piovt+1:], k-piovt-1)