题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
这道题需要注意的就是input.size()<k这个情况,
其他的思路就很简单,排序,输出
方法一:sort函数
由于用到了sort函数,因此时间复杂度是O(n*logn).
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector <int> res;
if(input.size()<k)
return res;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
res.push_back(input[i]);
return res;
}
};
方法二:用排序算法(插入、交换、选择)
需要用到两个for循环,外层循环是k次。所以时间复杂度是O(n*k)
冒泡排序:冒泡排序一般是把大的一步步往后放,这里要反着把小的数往后放,然后把小的数放到res中
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector <int> res;
int n=input.size();
if(n<k)
return res;
int temp;
for(int i=0;i<k;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(input[j]<input[j+1])
{
temp=input[j];
input[j]=input[j+1];
input[j+1]=temp;
}
}
res.push_back(input[n-i-1]);
}
return res;
}
};
选择排序:选择排序把当前(第i次)最小的数下标记录在index中,然后将其与第i个交换。
vector <int> res;
int n=input.size();
if(n<k)
return res;
for(int i=0;i<k;i++)
{
int index=i;
int temp=input[i];
for(int j=i+1;j<n;j++)
{
if (input[index]>input[j])
index=j;
}
input[i]=input[index];
input[index]=temp;
res.push_back(input[i]);
}
return res;
讨论区中还有用红黑树方法和堆排序的,时间复杂度更低。