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);
}
};