题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
求最小k个数,或者求第k大的数,或者求第k小的数;
像这类题型的解题思路就是先进行排序,再按找题意找出相应的值。对于排序的话,我一般会采用快速排序法;
这道题大家需要处理的边界是k大于输入vector的长度时的情况,此时应当返回空vector;
另外一个需要注意的是,在将vector作为参数给排序函数进行传递是,我们需要注意不要采用值传递,应当采用引用传递或者指针传递;否则在排序函数中对vector进行的操作不能改变实参的状态;vector向量作为参数传递可以参考点击打开链接
本题的解题思路具体细节见代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> result;
if (k > input.size())
{
result.resize(0);
return result;
}
//先排序(快速排序)
int start = 0;
int end = input.size() - 1;
quick_sort(input, start, end);
//在输出前k个数
for (int i = 0; i < k; i++)
{
result.push_back(input[i]);
}
return result;
}
void quick_sort(vector<int> &input, int start, int end)
{
int left = start;
int right = end;
int index = left;
int temp = input[left];
while (left < right)
{
while (left < right && input[right] >= temp)
{
right--;
}
input[left] = input[right];
index = right;
while (left < right && input[left] <= temp)
{
left++;
}
input[right] = input[left];
index = left;
input[index] = temp;
}
if (left - start > 1)
{
quick_sort(input, start, left - 1);
}
if (end - right > 1)
{
quick_sort(input, right + 1, end);
}
}
};