解法一:维度大小为k的堆
复杂度:
O
(
l
N
o
g
K
)
O(lNogK)
O(lNogK)
解法二:快速选择
快排其实还是有挺多细节的,
1 必须是右边的哨兵先走,因为要保证最后停在偏小的位置上,然后让哨兵和他交换位置。
2 递归终止条件可以设置为 l >= r,可以保证一个元素,或者出错时能停止。
class Solution {
public:
void qChoose(vector<int> &nums, int k, int l, int r)
{
if(l >= r)return;
int pivot = l, target = nums[l];
int pl = l, pr = r;
while(pl < pr)
{
while(pl < pr && nums[pr] >= target)pr--;
while(pl < pr && nums[pl] <= target)pl++;
if(pl < pr)swap(nums[pl], nums[pr]);
}
swap(nums[l], nums[pl]);
if(pl == k)return;
if(pl < k)qChoose(nums, k, pl+1, r);
else qChoose(nums, k, l, pl-1);
}
int findKthLargest(vector<int>& nums, int k) {
int n = nums.size();
qChoose(nums, n-k, 0, n-1);
return nums[n-k];
}
};