题目描述
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。
示例1
输入
复制
[1,3,5,2,2],5,3
返回值
复制
2
思路:
采取快速排序思想, 定下一个参考数a, 对数组进行调整, 使得比a大的数据在a的左边, 比a小的在a的右边, 同时返回a的位置 i
此时在数字a的左边有 i 个比它大的数字
比如如下数组
[ 5, 4, 2, 1, 0]
1的下标是 3, 左边就是有 3 个比它大的数字
根据 调整规则, 如上的数组, 数字1 就是第四大的数字 , 即是其下标 i 加上1
如果这时候 i+1 ==K 那么就array[i] 即是第K大的数字
如果 i+1 > K , 那么第K大的数字在array[i]的左部分, python中的切边表示即是 array[:i]
如果i + 1 < K, 那么第K大的数字是在array[i] 的右边部分, 同时要找的数字是右部分的第 K - (i + 1)大的数字
很明显了, 就是递归了。
class Solution:
# 求数组a的第K大数字
def solve(self, a, K):
# 只有一个元素了,直接返回
if len(a) == 1:
return a[0]
i = 0
j = len(a) - 1
k = a[i] #参考点
# 调节数组使得比参考点k小的在左边, 比k大的在参考点的右边。
while i < j:
while i < j and a[j] < k:
j -= 1
a[i], a[j] = a[j], a[i]
while i < j and a[i] >= k:
i += 1
a[i], a[j] = a[j], a[i]
if i + 1 == K:
return a[i]
if i+1 > K:
return self.solve(a[:i], K) #第K大在a[i]左边找
if i + 1< K:
return self.solve(a[i+1:], K - (i+1)) #第K大在a[i]右边找,同时变成了右边的第K-(i+1)大
def findKth(self, a, n, K):
# write code here
if a is None or n <= 0 or len(a) < n:
return None
return self.solve(a, K)