class Solution {
public:
int partition(vector<int>& a, int left, int right) {
int pivot = a[left];
int i = left, j = right;
while (i < j) {
while (i < j && a[j] <= pivot) j--;
a[i] = a[j];
while (i < j && a[i] >= pivot) i++;
a[j] = a[i];
}
a[i] = pivot;
return i;
}
int findKth(vector<int>& a, int n, int K) {
int left = 0, right = n - 1;
while (left <= right) {
int pos = partition(a, left, right);
int len_left = pos - left + 1;
if (len_left == K) {
return a[pos];
} else if (len_left > K) {
right = pos - 1;
} else {
K -= len_left;
left = pos + 1;
}
}
return -1;
}
};
len_left计算左侧部分的元素个数(包括基准值)
情况1:找到目标
如果左侧长度正好等于K,说明基准值就是第K大的元素
直接返回 a[pos]
情况2:目标在左侧
如果左侧长度大于K,说明第K大的元素在左侧部分
缩小搜索范围到左侧:right = pos - 1
情况3:目标在右侧
如果左侧长度小于K,说明第K大的元素在右侧部分
调整K值:K -= len_left(因为我们已经找到了前len_left个最大的元素)
缩小搜索范围到右侧:left = pos + 1