面试高频考题—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