题目
【输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4】
方法1 :排序法
直接对数组进行排序,然后前k个值就是满足要求的。但是该方法,在数据很多时,效率低。
代码:
class Solution {
public:
vector<int> res;
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
res.clear();
if(input.empty() || input.size()<k)
{
return res;
}
sort(input.begin(),input.end());
for(int i=0;i<k;++i)
{
res.push_back(input[i]);
}
return res;
}
};
方法二:最大堆
1、分析:
首先建立一个容器可以放下k个元素,首先将输入的前k个值存入该容器中。然后再将k+1之后的元素分别与容器内的元素进行比较。若大于容器内最大的值,则该输入被舍弃;若小于容器内的最大值,则将其与容器中的最大值进行调换。
该方法不需要一次将所有的数据都加载进内存中,对于海量的输入数据来说,具有很大的优势。
2、代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len=input.size();
// 注意处理意外情况
if(len<=0 || k<=0 ||k>len)
return vector<int>();
//将input容器中的前k个元素存入一个新容器中
vector<int> res(input.begin(),input.begin()+k);
//创建堆
make_heap(res.begin(),res.end());
for(int i=k;i<len;++i)
{
//如果堆中的最大值大于输入容器中的值,则将其进行替换
if(res.front()>input[i])
{
pop_heap(res.begin(),res.end());
res.pop_back();
res.push_back(input[i]);
push_heap(res.begin(),res.end());
}
}
sort_heap(res.begin(),res.end());
return res;
}
};