题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
思路
快速排序取前K个数
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
if(input.size()==0 || k>input.size()) return{};
vector<int> res;
quick_greater(0, input.size()-1, input);
for(int i = 0;i<k;i++)
{
res.push_back(input[i]);
}
return res;
}
private:
//快速排序
void quick_greater(int left,int right,vector<int>& arr)
{
if(left >= right) return;
int i,j,base,temp;
i = left,j = right;//左右哨兵
base = arr[left];//取最左面的数为基准
while(i<j)
{
while(arr[j] >= base && i<j)//从右向左找比基准小的值
{
j--;
}
while(arr[i] <= base && i<j)
{
i++;
}
if(i<j)//交换一次比基准大的和比基准小的值
{
temp = arr[i];
arr[i] = arr[j];
arr[j] =temp;
}
}
//交换基准值和i == j时的值
arr[left] = arr[i];
arr[i] = base;
quick_greater(left,i-1,arr);//递归左边
quick_greater(i+1,right,arr);//递归右边
}
};