背景:剑指40|41题
reference binding to null pointer of type 'struct value_type’报错
编译通过,运行报错且位置在STL文件
原因是在vector为空的时候试图访问vector[0]
剑指41:STL大|小根堆的使用
class MedianFinder {
//greaterheap 小根堆
//make_heap(begin(),end(),greater<int>());
//push_heap(begin(),end(),greater<int>());
//pop_heap(begin(),end(),greater<int>());
//lessheap 大根堆
//make_heap(begin(),end(),less<int>());
//push_heap(begin(),end(),less<int>());
//pop_heap(begin(),end(),less<int>());
private:
vector<int>bigheap; //[0]保留左半部分最大元素
vector<int>smallheap; //[0]保留右半部分最小元素
public:
MedianFinder(){
}
void addNum(int num) {
if(this->bigheap.size()<=this->smallheap.size())
{ //该向左边部分加入
if(this->bigheap.empty()||num<=this->smallheap[0])
{
this->bigheap.push_back(num);
push_heap(this->bigheap.begin(),this->bigheap.end(),less<int>());
}
else
{
this->bigheap.push_back(this->smallheap[0]);
pop_heap(this->smallheap.begin(),this->smallheap.end(),greater<int>());
this->smallheap.pop_back();
this->smallheap.push_back(num);
push_heap(this->smallheap.begin(),this->smallheap.end(),greater<int>());
push_heap(this->bigheap.begin(),this->bigheap.end(),less<int>());
}
}
else
{ //该向右半部分加入
if(num<this->bigheap[0])
{
this->smallheap.push_back(this->bigheap[0]);
pop_heap(this->bigheap.begin(),this->bigheap.end(),less<int>());
this->bigheap.pop_back();
this->bigheap.push_back(num);
push_heap(this->bigheap.begin(),this->bigheap.end(),less<int>());
push_heap(this->smallheap.begin(),this->smallheap.end(),greater<int>());
}
else
{
this->smallheap.push_back(num);
push_heap(this->smallheap.begin(),this->smallheap.end(),greater<int>());
}
}
}
double findMedian() {
// for(int i=0;i<this->bigheap.size();i++)
// cout<<this->bigheap[i]<<"\t";
// cout<<"bigheap"<<endl;
// for(int i=0;i<this->smallheap.size();i++)
// cout<<this->smallheap[i]<<"\t";
// cout<<"smallheap"<<endl;
if(this->smallheap.size()==this->bigheap.size())
return double(this->smallheap[0])/2+double(this->bigheap[0])/2;
else
return double(this->bigheap[0]);
}
};
/*
["MedianFinder","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian"]
[[],[-1],[],[-2],[],[-3],[],[-4],[],[-5],[]]
["MedianFinder","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian","addNum","findMedian"]
[[],[40],[],[12],[],[16],[],[14],[],[35],[],[19],[],[34],[],[35],[],[28],[],[35],[],[26],[],[6],[],[8],[],[2],[],[14],[],[25],[],[25],[],[4],[],[33],[],[18],[],[10],[],[14],[],[27],[],[3],[],[35],[],[13],[],[24],[],[27],[],[14],[],[5],[],[0],[],[38],[],[19],[],[25],[],[11],[],[14],[],[31],[],[30],[],[11],[],[31],[],[0],[]]
*/
/**
* Your MedianFinder object will be instantiated and called as such:
* MedianFinder* obj = new MedianFinder();
* obj->addNum(num);
* double param_2 = obj->findMedian();
*/
剑指40:(自实现大|小根堆)
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
// 模拟大根堆
if(k==0)
return vector<int>();
vector<int> num(k+1,INT_MAX);
for(int i=0;i<arr.size();i++)
{
// cout<<num[1]<<"\t";
if(arr[i]>=num[1])
continue;
num[1]=arr[i];
for(int m=1;m*2<num.size();)
{
int n;
if((m*2+1)>=num.size()||num[m*2]>num[m*2+1])
n=m*2;
else n=m*2+1;
if(num[m]>num[n])
break;
int tem=num[m];
num[m]=num[n];
num[n]=tem;
m=n;
}
// cout<<num[1]<<endl;
}
num.erase(num.begin());
// cout<<endl;
return num;
}
};