代码随想录算法训练营第十一天|栈和队列part3

相关链接

239. 滑动窗口最大值 - 力扣(LeetCode)

视频讲解:单调队列正式登场!| LeetCode:239. 滑动窗口最大值_哔哩哔哩_bilibili

347. 前 K 个高频元素 - 力扣(LeetCode)

视频讲解:优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素_哔哩哔哩_bilibili

滑动窗口最大值

解题思路——单调队列

文章链接:代码随想录 (programmercarl.com)

单调队列第一次了解,很多地方不是很熟悉,二刷的时候要再理解透彻!!!

AC代码

class Solution {
private:
    class MyQueue{
        public:
        dequeque;
        void pop(int val)
        {
            if(!que.empty()&&que.front()==val)
            que.pop_front();
        }
        void push(int val)
        {
            while(!que.empty()&&que.back() maxSlidingWindow(vector& nums, int k) {
        MyQueue que;
        vectorresult;
        for(int i=0;i

 前K个高频元素

解题思路-优先级队列

这道题目主要涉及到如下三块内容:

  1. 要统计元素出现频率
  2. 对频率排序
  3. 找出前K个高频元素

首先统计元素出现的频率,这一类的问题可以使用map来进行统计(key保存数组存的元素,value保存出现的频数)

然后是对频率进行排序,这里我们可以使用一种 容器适配器就是优先级队列

代码随想录算法训练营第十一天|栈和队列part3_第1张图片

补充知识:

定义小顶堆:

在写快排的cmp函数的时候,return left>right就是从大到小,return left就是从小到,优先级队列的定义正好反过来了。

定义:priority_queue
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式。

AC代码

class Solution {
public:
    class mycomparison {
    public:
        bool operator()(const pair& lhs, const pair& rhs) {
            return lhs.second > rhs.second;
        }
    };
    vector topKFrequent(vector& nums, int k) {
        unordered_map map; 
        for (int i = 0; i < nums.size(); i++) {
            map[nums[i]]++;
        }
        priority_queue, vector>, mycomparison> pri_que;

        for (unordered_map::iterator it = map.begin(); it != map.end(); it++) {
            pri_que.push(*it);
            if (pri_que.size() > k) { 
                pri_que.pop();
            }
        }
        
        vector result(k);
        for (int i = k - 1; i >= 0; i--) {
            result[i] = pri_que.top().first;
            pri_que.pop();
        }
        return result;

    }
};

遇到的困难&&总结

单调队列和优先级队列都是第一次接触,很多STL库中的底层还不太熟悉,调用也不怎么熟练,思路大概都懂,但是代码这部分还有待提高。

你可能感兴趣的:(算法)