题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
两种解法
1、O(n)复杂度的算法,找到数组中第k大的数,按照快排的二分搜索的想法,首先设定一个数,把比这个数小的都放到这个数的左边,比这个数大的都放在这个数的右边。如果左边数的个数小于k,从右边继续寻找,否则从左半部分开始寻找。知道找到数字的下标为k。
2、O(nlogk)复杂度算法,适合处理海量数据,创建大小为k的容器,在k中找到最大数,可以构建一个最大堆在O(1)时间得到已有数组的最大值,O(logk)时间完成删除和插入操作。如果插入的元素比这个容器的最大值小,那么替换最大值。一直到最后,如果构建最大堆比较困难,可以使用STL现成的红黑树关联容器,如multiset。
下面的代码是解法1的代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
if(k>input.size()||input.size()<=0)
return vector<int>{};
vector<int> res;
int begin=0;
int end=input.size()-1;
while(begin<=end)
{
int temp=input[begin];
int i=begin;
int j=end;
while(i<j)
{
while(input[j]>=temp&&i<j)
--j;
if(i<j)
input[i]=input[j];
while(input[i]<=temp&&i<j)
++i;
if(i<j)
input[j]=input[i];
}
input[i]=temp;
if(i==k-1)
{
int count=0;
while(count<k)
{
res.push_back(input[count]);
++count;
}
return res;
}
else if(i<k-1)
{
begin=i+1;
}
else
{
end=i-1;
}
}
return res;
}
};