2022年10月24日算法学习打卡

37 阅读1分钟

day13算法题(明天修改)

239. 滑动窗口最大值 (一刷至少需要理解思路)

之前讲的都是栈的应用,这次该是队列的应用了。

本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。

题目链接/文章讲解/视频讲解:programmercarl.com/0239.%E6%BB…

个人思路:

代码:

class MyQueue{
    public:
    deque<int> que;

    void pop(int value){
        if(!que.empty()&&value==que.front())
        {
            que.pop_front();
        }
        return;
    }

    void push(int value){
        while(!que.empty()&&value>que.back())  //相等时不做pop操作
        {
            que.pop_back();    //注意弹出尾部的值
        }
        que.push_back(value);
    }

    int getMax(){
        return que.front();
    }

};

class Solution {

public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> result;
        MyQueue myQue;
        int i = 0;
        int j = i+k;
        for(int jk=0;jk<k;jk++)
        {
            myQue.push(nums[jk]);
        }
        int max = myQue.getMax();
        result.push_back(max);
        while(j<n)
        {
            myQue.pop(nums[i]);
            myQue.push(nums[j]);
            int max=myQue.getMax();
            result.push_back(max);
            i++;
            j++;
        }
        return result;
    }
};

347.前 K 个高频元素 (一刷至少需要理解思路)

大/小顶堆的应用, 在C++中就是优先级队列

本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。

题目链接/文章讲解/视频讲解:programmercarl.com/0347.%E5%89…

思路:

代码:

class Solution {
public:
    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) {
        int n = nums.size();

        unordered_map<int,int> map;
        for(int i=0;i<nums.size();i++)
        {
            map[nums[i]]++;
        }

        // 对频率排序
        // 定义一个小顶堆,大小为k
        priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;

        // 用固定大小为k的小顶堆,扫面所有频率的数值
        for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
            pri_que.push(*it);
            if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
                pri_que.pop();
            }
        }

        // 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
        vector<int> result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;


    }
};