版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014303647/article/details/82668882
最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
法1:每次选一个最小的数,然后和前面的交换,那么时间复杂度就是O(K*N)
代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int>ans;
int len = input.size();
if(k>len) return ans;
for(int i=0;i<k;i++)
{
int index_x = i;
int index_y = i;
for(int j=i+1;j<len;j++)
if(input[j]<input[index_y]) index_y = j;
swap(input[index_x],input[index_y]);
}
for(int i=0;i<k;i++) ans.push_back(input[i]);
return ans;
}
};
法2:使用红黑树,红黑树的插入,查找,删除复杂度均是O(logk)。所以维护一个K个大小的红黑树,然后每次插入一个值的时候,和最大的值进行比较,如果比最大的小,那么删除最大的,插入这个值,那么时间复杂度为O(nlogk),mutliset和set都是基于红黑树实现的,因为可能有重复的,所以使用multiset。
代码:
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<algorithm>
#include<functional>
using namespace std;
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
multiset<int,greater<int> > mset;
mset.clear();
vector<int>ans;
int size = input.size();
for (int i = 0; i < size; i++)
{
if (mset.size() < k) mset.insert(input[i]);
else
{
multiset<int, greater<int> >::iterator iter = mset.begin();
if (input[i]< *iter)
{
mset.erase(iter);
mset.insert(input[i]);
}
}
}
multiset<int, greater<int> >::iterator iter = mset.begin();
while (iter != mset.end())
{
ans.push_back(*iter);
++iter;
}
reverse(ans.begin(), ans.end());
return ans;
}
int main()
{
vector<int>ans;
initializer_list<int>lst = { 4, 5, 1, 6, 2, 7, 3, 8 };
vector<int>vec(lst);
ans = GetLeastNumbers_Solution(vec, 5);
vector<int>::iterator iter = ans.begin();
while (iter != ans.end())
{
cout << *iter << " ";
++iter;
}
cout << endl;
//cout << MoreThanHalfNum_Solution(numbers) << endl;
return 0;
}