解题思路:
1,借用快排分治的思想;
2,递归函数中,每次随机选取一个数作为标的mark;
3,把 比mark大的存入一个数组larger,比mark小的存入另外一个数组smaller
4,结束条件就是,所找的第k大的数, k == larger.size() + 1
// C++ 实现
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return find(nums, k);
}
int find(vector<int>& nums, int k){
int n = nums.size();
vector<int> smaller;
vector<int> larger;
int inx = rand()%n;
for (auto elem: nums){
if (elem > nums[inx]){
larger.push_back(elem);
}else if (elem < nums[inx]){
smaller.push_back(elem);
}
}
int sizeA = smaller.size();
int sizeB = larger.size();
if (sizeB < k && (n - sizeA) >= k){
return nums[inx];
}else{
if (sizeB >= k){
return find(larger, k);
}else if (n - sizeA < k){
return find(smaller, k-(n-sizeA));
}
}
}
};
# python 实现
import random
class Solution:
# @param {integer[]} nums
# @param {integer} k
# @return {integer}
def find(self, nums, n, k):
inx = int(random.random()*n)
a = [ i for i in nums if i < nums[inx]]
smaller = len(a)
b = [ i for i in nums if i > nums[inx]]
larger = len(b)
if smaller < k and n - larger >= k:
return nums[inx]
else:
if smaller >= k:
return self.find(a, smaller, k)
elif n - larger < k:
return self.find(b, larger, k - (n-larger))
def findKthLargest(self, nums, k):
return self.find(nums, len(nums), len(nums)- k + 1)