有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。
-- coding:utf-8 --
sort()
class Solution:
def findKth(self, a, n, K):
# write code here
a.sort(reverse=True)
return a[K-1]
使用快排思想
class Solution:
def findKth(self, a, n, K):
result = self.quickSort(a, K)
return result
# 递归
def quickSort(self, a, K):
left = -1
n = len(a)
right = n - 1
i = left + 1
# 快排思想,一次循环将a分成三部分,左边比a[-1]小,中间等于a[-1],右边比a[-1]大!
while i < right:
if a[i] < a[-1]:
left += 1
a[i], a[left] = a[left], a[i]
i += 1
elif a[i] > a[-1]:
right -= 1
a[i], a[right] = a[right], a[i]
else:
i += 1
a[-1], a[right] = a[right], a[-1]
right += 1
# 比a[-1]大的不足K个,但大于等于a[-1]的超过K个,直接返回a[-1]
if (n - right) < K <= (n - left - 1):
return a[left + 1]
# 比a[-1]大的不少于K个,则从比a[-1]大的开始递归
if (n - right) >= K:
return self.quickSort(a[right:], K)
# 大于等于a[-1]的不足K个,则从比a[-1]小的开始递归,并更新K值
if (n - left - 1) < K:
return self.quickSort(a[:left+1],K-(n - left - 1))