C++中vector和堆的常用使用方法&例题:数据流中的中位数

vector常用函数:

(1)a.size();//返回a中元素的个数;

(2)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5

(3)a[i]; //返回a的第i个元素,当且仅当a[i]存在

(4)a.empty();//判断a是否为空,空则返回ture,不空则返回false

(5)a.clear();//清空a中的元素

(6)a.back();//返回a的最后一个元素

(7)a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)

(8)a.insert(a.begin()+1,5);//在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4

(9)a.insert(a.begin()+1,3,5);//在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5

(10)a.insert(a.begin()+1,b+3,b+6);//b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8

扫描二维码关注公众号,回复: 11204227 查看本文章

(11)a.pop_back();//删除a向量的最后一个元素

(15)a.capacity();//返回a在内存中总共可以容纳的元素个数

堆常用函数:

1.先建立vector<int> nums = {9, 6, 2, 4, 7, 0, 1, 8, 3, 5};

make_heap(nums.begin(), nums.end(), less<int>());(堆首为最大值)

或make_heap(nums.begin(), nums.end(), greater<int>());(堆首为最小值)

2.更新堆(貌似不建立,直接push——heap也行)

nums.push_back(10);

push_heap(nums.begin(), nums.end(), less<int>());

3.删除堆首元素:pop_heap()  注意:先pop_heap(),vector后pop_back():

pop_heap(nums.begin(), nums.end(), less<int>());

nums.pop_back();

原理:堆其实就是把vector内的元素最大值或最小值转移到nums[0]上。而pop_heap()是将nums[0]放到堆尾部,继而调用vector清除队尾

问题:push_heap()并没有传递指针这一类的东西,怎么做到改变vector的?

最后附上一道剑指offer题目:数据流中的中位数

void Insert(int num)
    {
        int k=max.size()+min.size();
        //数组进前两个元素
        if(k<2){
            //max.push_back(num);
            //前两个不需要建堆
            if(k==0){
                max.push_back(num);
            }
            if(k==1){
                if(num>max[0]){
                    int tmp;
                    tmp=max[0];
                    max[0]=num;
                    min.push_back(tmp);
                    return;
                }
                min.push_back(num);
            }
        }
        //自前两个元素开始//保证大堆永远仅比小堆大1或0
        //所有元素判断是否比小堆(从大到小3 2 1)min[0]还小,小的话进小堆,通过倾倒机制保证小堆一直比大堆小0或1
        //若不比小堆min[0]小,则 进大堆(从小到大4 5 6),大堆有倾倒机制保证大堆一直比小堆大0或1
        //倾倒机制:(若大堆元素比小堆大两个则分一个给小堆,或小堆比大堆大时把min[0]放入大堆)
        if(k>1){
            //元素判断是否比小堆(从大到小3 2 1)min[0]还小
            if(num<min[0]){
                //小的话开始处理
                min.push_back(num);
                int flag=min.size()-max.size();
                if(flag>0){
                    //把min[0]拿到max[0]位置上了
                    max.push_back(min[0]);
                    pop_heap(min.begin(),min.end(),less<int>());
                    min.pop_back();
                    push_heap(max.begin(),max.end(),greater<int>());
                }
            }
            //不小则进大堆通过倾倒机制分配
            else{
                max.push_back(num);
                push_heap(max.begin(),max.end(),greater<int>());
                int pool=max.size()-min.size();
                if(pool>1){
                    //当max数量较min大2时,开始倾倒
                    min.push_back(max[0]);
                    pop_heap(max.begin(),max.end(),greater<int>());
                    max.pop_back();
                    push_heap(min.begin(),min.end(),less<int>());
                }
            }
            return;
        }
    }

    double GetMedian()
    {
        int k1=max.size();
        int k2=min.size();
        //大堆比小堆多1时。直接返回max[0]
        if(k1>k2){
            return max[0];
        }
        else{
            double avg=(max[0]+min[0])/2.0;
            return avg;
        }
    }
    vector<int>max;
    vector<int>min;

 内容参考:

1.https://www.jianshu.com/p/13a56502e217

2.https://blog.csdn.net/rxm1989/article/details/39549689

3.https://www.nowcoder.com/ta/coding-interviews?asc=true&order=difficulty

猜你喜欢

转载自www.cnblogs.com/hqdong123/p/12897816.html