力扣 reference binding to null pointer of type ‘struct value_type‘报错及STL大小根堆(自用)

背景:剑指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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值