Day13 239.滑动窗口最大值 347.前k个高频元素

Day13 239.滑动窗口最大值 347.前k个高频元素

239.滑动窗口最大值

class Solution {
public:
//三个方法传递queue的引用
    void pop(int val, deque<int>& que)
    {   
        if(!que.empty()&&que.front()==val) que.pop_front();
    }
    void push(int val,deque<int>& que)
    {
        while(!que.empty()&&que.back()<val)
        {
            que.pop_back();
        }
        que.push_back(val);
    }
    int getMaxValue(deque<int>& que)
    {
        return que.front();
    }
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> Result; //记录结果的数组
        deque<int> que; //初始化队列,Index从0到k-1
        for(int i=0; i<k;i++)
        {
            push(nums[i],que);
        }
        //Result先放个初始状态的元素
        Result.push_back(getMaxValue(que));
        for(int i =k;i<nums.size();i++)
        {
            push(nums[i],que);
            pop(nums[i-k],que);
            Result.push_back(getMaxValue(que));
        }
    return Result;
    }
};

347.前k个高频元素

priority_queue用法

priority_queue只提供了以下几个成员函数用于访问和修改堆顶元素:

  • top():返回最大(或最小)元素的引用,但并不从队列中移除该元素。
  • push(const T& value):将一个元素加入队列中,并按优先级进行调整。
  • pop():移除队列中的最大(或最小)元素。

需要注意的是,默认情况下,std::priority_queue 是按照元素的比较运算符 < 进行堆排序的,所以堆顶元素默认是最大的元素。

class Solution {
public:
//自定义priority_queue排序规则
    class myComparison{
        public:
        bool operator()(const pair<int,int>& lhs, const pair<int,int>& rhs){
            return lhs.second > rhs.second;
        }
    };
    vector<int> topKFrequent(vector<int>& nums, int k) {
       unordered_map<int,int> map;
       for(int i =0;i<nums.size();i++)
       {
           map[nums[i]]++;
       }
        priority_queue<pair<int,int>,vector<pair<int,int>>,myComparison> pri_que;

        for(unordered_map<int,int>::iterator it =map.begin();it!=map.end();it++){
            pri_que.push(*it);
            if(pri_que.size()>k) pri_que.pop();
        }
        //遍历pri_que的first值
        vector<int> result(k);
        for(int i=0;i<k;i++)
        {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;

    }
};
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值