class Solution { public: /** 在input中[lh, rh)查找前k小的数并返回 */ vector<int> GetLeastNumbers(vector<int> &input, int lh, int rh, int k) { if(k == 0) { return {}; } if(rh - lh == 1) { return {input[lh]}; } int pivot = lh; int index = pivot + 1; for(int i = index; i < rh; ++i) { if(input[i] > input[pivot]) { int tmp = input[i]; input[i] = input[index]; input[index] = tmp; ++ index; } } vector<int> result; int rank = rh - index + 1; if(rank > k) { return GetLeastNumbers(input, index, rh, k); } else { // rank <= k result.push_back(input[pivot]); if(rank > 1) { auto smaller = GetLeastNumbers(input, index, rh, rank - 1); result.insert(result.end(), smaller.begin(), smaller.end()); } if(rank < k) { auto larger = GetLeastNumbers(input, pivot + 1, index, k - rank); result.insert(result.end(), larger.begin(), larger.end()); } } return result; } /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param input int整型vector * @param k int整型 * @return int整型vector */ vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) { // write code here return GetLeastNumbers(input, 0, input.size(), k); } };