堆的相关学习

数据结构——堆

剑指 offer leecode 215. 数组中的第K个最大元素

通过构建大根堆,再进行k - 1次删除堆顶元素操作
基础的数组构建堆操作,背过模板

void maxHeapfidy(vector<int>& nums, int i, int heapSize){
        int l = i * 2 + 1, r = i * 2 + 2, largest = i;
        if(l < heapSize && nums[l] > nums[largest])largest = l;
        if(r < heapSize && nums[r] > nums[largest])largest = r;
        if(largest != i){
            swap(nums[i], nums[largest]);
            maxHeapfidy(nums, largest, heapSize);
        }
    }
    void buildMaxHeap(vector<int> &nums, int heapSize){
        for(int i = heapSize/ 2; i >= 0; i --)maxHeapfidy(nums, i, heapSize);
    }
    int findKthLargest(vector<int>& nums, int k) {
        int heapSize = nums.size();
        buildMaxHeap(nums,heapSize);
        for(int i = nums.size() - 1; i >= nums.size() - k + 1; --i){
            swap(nums[0], nums[i]);
            --heapSize;
            maxHeapfidy(nums, 0, heapSize);
        }
        return nums[0];
    }	
直接通过优先队列构建堆

std::priority_queue模板类:

在这里插入图片描述
有3个模板参数,其中后两个都有默认值。第1个参数是数据类型,比如int。第2个参数是用于存储元素的底层容器类型,默认是用vector。第3个参数是比较函数,默认是less,所以默认是大顶堆。
第三种写法还可以在自定义函数的时候这样写:

priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);

这里的cmp是按照pair第二个元素从大到小排序的函数。decltype 用于类型自动推断,传入&cmp函数指针,decltype自动推断出第3个模版参数类型应该是什么。

leecode 347.前k个高频元素
class Solution {
public:

     static bool cmp(pair<int, int>&a, pair<int, int> &b){
       return a.second > b.second;
   }

    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int>map;
        for(auto & num: nums)map[num]++;

        priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&cmp)> q(cmp);
        for(auto &[num, count] : map){
            if(q.size() == k){
                if(q.top().second < count){
                    q.pop();
                    q.emplace(num, count);
                }
            }else q.emplace(num, count);
        }
        vector<int>ret;
        while(q.size()){
            ret.emplace_back(q.top().first);
            q.pop();
        }
        return ret;
    }
};

构建一个只有k个最大高频元素的堆,若堆中已有k个元素,则通过对比后弹出最顶部的元素。
很玄学啊,为什么一样的代码第一次交的时候8ms, 第二次就16了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值