您的位置:首页 > 职场人生

剑指offer面试题30:用自定义堆实现

2016-07-25 19:49 549 查看
   保存数组的前k个最小值,剑指offer用的是STL中的multimap容器,我就通过自己实现一个最大堆来实现同样的效果,时间复杂度同样为O(nlogk),理解起来也比较简单,代码如下:

//找最小的k个数,用堆来操作
class heap
{
public:
void push(int num)
{
result.push_back(num);
keep_heap(result.size());
}
int max() const
{
return result[0];
}
void sort()
{
int size=result.size();
for(int i=size;i>1;i--)
{
keep_heap(size);
int tem=result[i];
result[i]=result[i-1];
result[i-1]=tem;
}
}

void pop_max()
{
int tem=result[0];
result[0]=result[result.size()-1];
result[result.size()-1]=tem;
result.pop_back();
keep_heap(result.size());
}

private:
void make_heap(int i,int size)
{
int left=2*i+1;
int right=2*i+2;
int least=i;

if(left<result.size()&&result[i]<result[left])
least=left;
if(right<result.size()&&result[i]<result[right])
least=right;

if(least!=i)
{
int tem=result[i];
result[i]=result[least];
result[least]=tem;
make_heap(least,size);
}
}

void keep_heap(int size)
{
int i=(result.size()-1)/2;
for(;i>=0;i--)
{
make_heap(i,size);
}
}
public:
vector<int> result;
};

class LeastNum
{
public:
vector<int> get_leastnumbers(int istr[],int len,int k)
{
heap my_heap;
if(len<=0||istr==nullptr)
return vector<int>();
if(len<=k)
{
vector<int> tem(istr,istr+len);
return tem;
}

for(int i=0;i<len;i++)
{
if(i<k)
{
my_heap.push(istr[i]);
}
else if(istr[i]<my_heap.max())
{
my_heap.pop_max();
my_heap.push(istr[i]);
}
}
return my_heap.result;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
LeastNum l;
int num[10]={4,5,1,6,2,7,3,8};
vector<int> tem=l.get_leastnumbers(num,8,4);

for(int i=0;i<tem.size();i++)
{
cout<<tem[i]<<" ";

}
return 0;
}
 

<
4000
/p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: