输入n个整数,找到最小的k个数。
划分原来没我想象的那么简单,因为需要注意临界情况。
int partitionHelp(vector<int> &A,int l,int r)
{
int i=l-1;
int x=A[r];
for(int j=l;j<r;++j)
{
if(A[j]<x)
{
++i;
swap(A[i],A[j]);
}
}
++i;
swap(A[i],A[r]);
return i;
}
vector<int> findKMin(vector<int> vec,int k)
{
int l=0,r=vec.size()-1;
int idx=partitionHelp(vec,l,r);
while(idx!=k-1)
{
if(idx>k-1)
r=idx-1;
else
l=idx+1;
idx=partitionHelp(vec,l,r);
}
vector<int> ret(vec.begin(),vec.begin()+k);
return ret;
}
基于最大堆的算法,使用到了C++的set数据结构
vector<int> findKminHeap(vector<int> &vec,int k)
{
set<int,greater<int>> kset;
int i=0;
for(;i<vec.size() && i<k;++i)
{
kset.insert(vec[i]);
}
for(;i<vec.size();++i)
{
if(*(kset.begin())>vec[i])
{
kset.erase(kset.begin());
kset.insert(vec[i]);
}
}
vector<int> ret;
for(set<int,greater<int>>::iterator it=kset.begin();it!=kset.end();++it)
{
ret.push_back(*it);
}
return ret;
}
还可以用stl的优先级队列,注意和set的区别是set的最开头元素和优先级的top返回的值在该数据结构的大小。所以priotity_queue是less<int>
vector<int> findKminPrioQue(vector<int> &vec,int k)
{
priority_queue<int,vector<int>,less<int>> kque;
int i=0;
for(;i<vec.size() && i<k;++i)
{
kque.push(vec[i]);
}
for(;i<vec.size();++i)
{
if(kque.top()>vec[i])
{
kque.pop();
kque.push(vec[i]);
}
}
vector<int> ret;
while(!kque.empty())
{
ret.push_back(kque.top());
kque.pop();
}
return ret;
}