面试高频考题—TOP K问题
题目描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
算法思路:我们知道快速排序的每一次排序结果 都会确定
基准元素
的位置 假设为mid
,另外题目要求找的是第K
个最大的元素,而不是第k
个最小的 元素,所以我们需要找到第K
个最大的元素 下标与 第k
个最小的 元素 下标之间的转换关系 我们举个例子假设共有100个数 分别是从1到100,那么 第
1
个最大的数100
,也就是第100
个最小的元素,这个最小元素(也就是100
)在排序后 所处的下标应该是99
,同理, 那么 第
2
个最大的数99
,也就是第99
个最小的元素,这个最小元素(也就是99
)在排序后 所处的下标应该是98
所以 我们很容易找到类比关系 第
K
个最大的元素 下标与 第k
个最小的 元素 下标之间的转换关系为第
k
个最小的 元素 下标 = 数组长度 - 第K
个最大的元素 下标我们在得到
基准元素
的位置mid
后,就可以 通过比较mid
与k
之间的关系 来判断我们所要找的数 在mid
之前 还是之后算法描述到这里 已经呼之欲出了,下面给出
python
版本的 答案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
29
30class Solution:
def findKthLargest(self, nums: List[int], k: int) -> int:
# TOP K问题
# 使用快速排序的思想
def quick_sort(nums,low,high):
flag=nums[low]
while low<high: # 这里没有等于号
#从右到左 找比flag小的数
while low<high and nums[high]>=flag:#????
high-=1
nums[low]=nums[high]
# 从左到右 找flag 大的数
while low<high and nums[low]<=flag:
low+=1
nums[high]=nums[low]
nums[low]=flag
return low
low=0
random.shuffle(nums) #YYDS
high=len(nums)-1
k=len(nums)-k
while low<=high:
mid=quick_sort(nums,low,high)
if mid==k:
return nums[mid]
elif mid>k:
high=mid-1
else:
low=mid+1