剑指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>
//找最小的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>
相关文章推荐
- java面试经历
- Google研究主管Peter Norvig:想当程序员吗?这里份成功“食谱”
- 记一次面试经历(互联网金融行业)
- 从程序员到事业单位再到公务员的一点感想
- C#面试-总结
- PHP工程师面试常见问题
- JAVA多线程和并发基础面试
- Java线程面试题
- 论初级程序员的自我修养
- 剑指offer面试题28-29
- 给年轻程序员的话
- 从今天开始,做一个测试工程师
- 让两个数进值互换 面试题
- 前端面试题答案的解答:html+css部分
- [转]海量数据处理面试题总结
- 剑指offer面试题36:数组中的逆序对
- View的相关面试题(待补充)
- 写给Java程序员的Scala入门教程
- 编程老手的哪些特点,是值得新手程序员学习的?
- 剑指offer面试题 22 栈的压入、弹出序列的匹配