题目:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
方法一:
对元素排序,取前k个元素,即为最小的k个数,当k大于元素个数时,返回空
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int>result;
int len=input.size();
if(k>len||k<=0)
return result;
sort(input.begin(),input.end());
for(int i=0;i<k;i++)
result.push_back(input[i]);
return result;
}
};
时间复杂度:O(nlogn)
方法二:
取前k个数,从小到大排序
对于剩下的n-k个数,遍历,如果小于k个数中的最大值,该数代替最大值,并保持排序状态
此处感谢Aff ''指出错误,现已改正
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int>result;
int len=input.size();
if(k>len||k<=0)
return result;
for(int i=0;i<k;i++)
result.push_back(input[i]);
sort(result.begin(),result.end());
for(int i=k;i<len;i++)
{
if(input[i]<result[k-1])
{
result[k-1]=input[i];
sort(result.begin(),result.end());
}
}
return result;
}
};
时间复杂度:O((n-k) k logk)
方法三:
利用堆排序,O(n logk),适合处理海量数据
- 遍历输入数组,将前k个数插入到推中;(利用multiset来做为堆的实现)
- 继续从输入数组中读入元素做为待插入整数,并将它与堆中最大值比较:如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;如果待插入的值比当前已有的最大值还大,则抛弃这个数,继续读下一个数。
这样动态维护堆中这k个数,以保证它只储存输入数组中的前k个最小的数,最后输出堆即可。
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int> result;
int len = input.size();
if(input.empty() || k<=0 || len < k) return result;
multiset<int, greater<int> > leastNumbers; // 从大到小排序
multiset<int, greater<int> >::iterator iterGreater; // 定义迭代器
vector<int>::iterator iter = input.begin();
for(; iter != input.end(); ++iter)
{
// 将前k个数直接插入进multiset中,注意是小于K
if(leastNumbers.size() < k)
{
leastNumbers.insert(*iter);
}
else
{
// 因为设置的从大到小排序,故multiset中第一个位置的元素即为最大值
iterGreater = leastNumbers.begin();
// 如果input中当前元素比multiset中最大元素小,则替换;即保持multiset中这k个元素是最小的。
if(*iter < *(leastNumbers.begin()))
{
// 替换掉当前最大值
leastNumbers.erase(iterGreater);
leastNumbers.insert(*iter);
}
}
}
for(iterGreater = leastNumbers.begin();iterGreater!=leastNumbers.end();++iterGreater)
{ //!!注意mulitset迭代器不支持比较大小
result.push_back(*iterGreater); // 将multiset中这k个元素输出
}
return result;
}
};
时间复杂度:O(N logK)
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int>res;
int n = input.size();
if (input.empty() || k<=0|| k > n)
return res;
priority_queue<int>q;
int i=0;
for (; i < k; i++)
q.push(input[i]);
for (; i<n; i++) {
q.push(input[i]);
q.pop();
}
while (!q.empty()){
res.push_back(q.top());
q.pop();
}
return res;
}
};