该题方法较多,但比较好的一种方法是借鉴快排思想,快排中每次交换操作之后,都能确定一个第n大的数,因此只需判断n与k的大小,然后选择查找范围递归进行查找即可。平均时间复杂度 O(n),空间复杂度 O(1)。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int L = 0, R = nums.size() - 1;
while (L < R) {
int left = L, right = R;
int key = nums[left];
while (left < right) {
while (left < right && nums[right] < key) --right;
nums[left] = nums[right];
while (left < right && nums[left] >= key) ++left;
nums[right] = nums[left];
}
nums[left] = key;
if (left == k - 1) return nums[k - 1];
else if (left > k - 1) R = left - 1;
else L = left + 1;
}
return nums[k - 1];
}
};