class Solution { public: /** find Kth element in 'a' in range [lh, rh) */ int findKth(vector<int> &a, int lh, int rh, int K) { if(rh - lh == 1) { return a[lh]; } int pivot = lh; int index = lh + 1; for(int i = index; i < rh; ++i) { if(a[i] < a[pivot]) { swap(a, index, i); ++ index; } } int rank = rh - index + 1; if(rank == K) { return a[pivot]; } else if(rank < K) { return findKth(a, pivot + 1, index, K - rank); } else { // rank > K return findKth(a, index, rh, K); } } /** swap a[i1] and a[i2] */ void swap(vector<int> &a, int i1, int i2) { int tmp = a[i1]; a[i1] = a[i2]; a[i2] = tmp; } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param n int整型 * @param K int整型 * @return int整型 */ int findKth(vector<int>& a, int n, int K) { // write code here auto a_clone = a; return findKth(a, 0, a.size(), K); } };
快排思路,易错点在于边界