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

来源:互联网 发布:tfboys官方周边淘宝店 编辑:程序博客网 时间:2024/06/05 12:49

   保存数组的前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;} 


0 0
原创粉丝点击