《剑指offer》面试题30——最小的k 个数
1.题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
2.解题思路:
1。全排序。时间复杂度O(nlogn)。
2。Partiton思想 ——用快速排序,时间复杂度O(n) 。
3。最大堆 时间复杂度O(nlogk)
4。红黑树:multiset集合。
3.代码实现:
3.1.方法1代码
#include<algorithm>
#include<iostream>
#include <vector>
using namespace std;
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
vector<int> res;
res.clear();
if(input.empty()||k>input.size())
return res;
sort( input.begin(), input.end());
for(int i=0; i<k; i++)
res.push_back(input[i]);
return res;
}
void Print1Dvec(vector<int> myarray)
{
if(myarray.size()==0)
cout<<"vector为空"<<endl;
int num=myarray.size();
for(int i=0; i<num;i++)
cout<<myarray[i]<<" ";
cout<<endl;
}
int main()
{
vector<int>vec={1,5,1,1,1,7,1,8};
Print1Dvec(vec);
vector<int>vec2=GetLeastNumbers_Solution(vec ,4);
Print1Dvec(vec2);
return 0;
}
运行结果:
1 5 1 1 1 7 1 8
1 1 1 1
Process returned 0 (0x0) execution time : 0.429 s
Press any key to continue
方案4代码:
//multiset
//当容器中的元素数量不够k 个时,直接放入容器中
//当容器中的元素数量满k个时,,把当前数组中的元素与容器中的最大的元素比较。
//如果当前元素值小于容器中的最大值,则将容器中的最大值替换为当前值。
#include<iostream>
#include <vector>
#include<set>
using namespace std;
//typedef multiset<int, greater<int>> intSet;
//typedef multiset<int, greater<int>>::iterator setiter;
vector<int> GetLeastNumbers_Solution(vector<int> input, int k)
{
multiset<int, greater<int>> LeastNumber ;
if(input.size()<=0||k>input.size())
return vector<int> ();
//仿函数中的greater<T>模板,从大到小排序
vector<int>::iterator itervec=input.begin();
for(; itervec!=input.end(); itervec++ )
{
if(LeastNumber.size()<k) //当容器中的元素数量不够k 个时,直接放入容器中
LeastNumber.insert(*itervec);
else //当容器中的元素数量满k个时,,把当前数组中的元素与容器中的最大的元素比较。
{
multiset<int, greater<int>>::iterator Itergreast=LeastNumber.begin();
if(*itervec<*Itergreast)
{
LeastNumber.erase( Itergreast); //删除迭代器指针指向的元素
LeastNumber.insert(*itervec); //插入元素值
}
}
}
return vector<int>(LeastNumber.begin(),LeastNumber.end());
}
void Print1Dvec(vector<int> myarray)
{
if(myarray.size()==0)
cout<<"vector为空"<<endl;
int num=myarray.size();
for(int i=0; i<num;i++)
cout<<myarray[i]<<" ";
cout<<endl;
}
int main()
{
vector<int>vec={1,5,1,1,1,7,1,8};
Print1Dvec(vec);
vector<int>vec2=GetLeastNumbers_Solution(vec ,4);
Print1Dvec(vec2);
return 0;
}
运行结果:
1 5 1 1 1 7 1 8
1 1 1 1
Process returned 0 (0x0) execution time : 0.446 s
Press any key to continue.