一.题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
二.代码(C++)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> output;
int n = input.size();
if(n<k || n==0 ||k<=0)
return output;
priority_queue<int> pq;
for(int i=0;i<n;++i)
{
if(pq.size()<k)
pq.push(input[i]);
else if(pq.top()>input[i])
{
pq.pop();
pq.push(input[i]);
}
}
while(!pq.empty())
{
output.push_back(pq.top());
pq.pop();
}
return output;
}
};
三.提交记录
g)
四.备注
1.用sort算法直接排序取前n个数
2.创建一个大小为k的优先队列(或关联容器multiset也行),迭代一遍数组,每次判断新元素是否比队列中最大的元素小,成立则替换。最后输出队列中的元素(无序)。
3.使用partition思想,每次找一个元素作为标志(最右边的或者最左边的)将所有比该元素小的放到左边,大的放到右边,该元素位置设置为p。判断p+1是否等于k,如果相等,直接输出,如果p+1<k,在p+1右面再找一个标志,否则在左边再找一个标志。
注:本文代码是方法2。