算法刷题Day 13 滑动窗口最大值+前K个高频元素

这篇具有很好参考价值的文章主要介绍了算法刷题Day 13 滑动窗口最大值+前K个高频元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Day 13 栈和队列

239. 滑动窗口最大值

乍一看有点单调栈的意思,但其实不是。

仔细想想应该是用优先队列,似乎也不对,从滑动窗口出来的元素不好从队列中删除

看了随想录之后,是用到单调队列

使用单调队列有坑的地方:

case:nums =[-7,-8,7,5,7,1,6,0], k = 4

单调队列在push的时候,如果红框为>=号,那么结果会出错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9t625hHF-1687149547971)(E:\OneDrive\面试资料\训练营\LC239-滑动窗口最大值.assets\image-20230617144701762.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DtHe5Ve-1687149547973)(E:\OneDrive\面试资料\训练营\LC239-滑动窗口最大值.assets\image-20230617144724157.png)]

正确的写法:相等的话,也要插入单调队列中

class Solution {
    class MaxQueue
    {
        int len;
        deque<int> que;
    
    public:
        int front()
        {
            return que.front();
        }

        void pop(int val)
        {
            if (val == que.front())
            {
                que.pop_front();
            }
        }

        void push(int val)
        {
            while (!que.empty() && val > que.back())
            {
                que.pop_back();
            }
            que.push_back(val);
        }
    };

public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        MaxQueue slideWin;
        vector<int> rst;

        auto iter = nums.begin();
        while (k-- && iter != nums.end())
        {
            slideWin.push(*iter++);
        }
        rst.push_back(slideWin.front());
        auto discard = nums.begin();

        while (iter != nums.end())
        {
            slideWin.pop(*discard);
            slideWin.push(*iter);
            rst.push_back(slideWin.front());
            discard++;
            iter++;
        }

        return rst;
    }
};

347. 前K个高频元素

首先想到的是优先队列

设计仿函数的时候,记得要把operator()函数的权限设置为public

因为类默认是私有的访问权限,而operator()是要被调用的

class Solution {
    class CmpPair {
    public:
        bool operator()(const pair<int, int> &a, const pair<int, int> &b) {
            return a.second < b.second;
        }
    };

public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> table;

        for (auto num : nums)
        {
            table[num]++;
        }

        priority_queue<pair<int, int>, vector<pair<int, int>>, CmpPair> que;
        for (auto &item : table)
        {
            que.push(item);
        }

        vector<int> rst;
        for (int i = 0; i < k; ++i)
        {
            rst.push_back(que.top().first);
            que.pop();
        }

        return rst;
    }
};

以上是我的实现,其实跟排一次序没有区别。代码随想录里的实现还限制了优先队列里的元素个数为k

可以改进一下

这个时候排列的顺序要从小到大文章来源地址https://www.toymoban.com/news/detail-541526.html

class Solution {
    class CmpPair {
    public:
        bool operator()(const pair<int, int> &a, const pair<int, int> &b) {
            return a.second > b.second;
        }
    };

public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        unordered_map<int, int> table;

        for (auto num : nums)
        {
            table[num]++;
        }

        priority_queue<pair<int, int>, vector<pair<int, int>>, CmpPair> que;
        for (auto &item : table)
        {
            que.push(item);
            if (que.size() > k)
            {
                que.pop();
            }
        }

        vector<int> rst(k);
        for (int i = k - 1; i >= 0; --i)
        {
            rst[i] = que.top().first;
            que.pop();
        }

        return rst;
    }
};

到了这里,关于算法刷题Day 13 滑动窗口最大值+前K个高频元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 239. 滑动窗口最大值

    力扣题目链接   (opens new window) 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 提示:

    2024年02月15日
    浏览(40)
  • 单调队列-滑动窗口最大值

    Problem: 239. 滑动窗口最大值 输入一个数组nums,滑动窗口k遍历该数组,输出得到的最大值数组; 示例1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 构造一个单调队列表示当前窗口中单调递减的队列,队列的头就是最大值,为保证这个队列是窗口数据的表示,每次判断队

    2024年02月22日
    浏览(44)
  • 华为OD-滑动窗口最大值

    给你一个整数数组  nums ,有一个大小为  k   的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的  k  个数字。滑动窗口每次只向右移动一位。 返回  滑动窗口中的最大值  。 示例二 代码实现

    2024年02月11日
    浏览(36)
  • LeetCode239.滑动窗口最大值

    看到这道题我就有印象, 我在剑指offer里面做过这道题,我记得当时用的是优先队列,然后我脑子里一下子就有了想法,拿优先队列作为窗口,每往右移动一步,把左边的数remove掉,把右边的数add进来,然后把队头,也就是窗口中最大的元素放入答案数组,然后就写出了如下

    2024年02月11日
    浏览(39)
  • leetcode-239-滑动窗口最大值

    题意描述: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动

    2024年02月07日
    浏览(45)
  • 【LeetCode热题100】【子串】滑动窗口最大值

    题目 给你一个整数数组  nums ,有一个大小为  k   的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的  k  个数字。滑动窗口每次只向右移动一位。 返回  滑动窗口中的最大值  。 示例 1: 示例 2: 提示: 1 = nums.length = 105 -104 = nums[i] = 104 1 =

    2024年01月19日
    浏览(45)
  • 力扣热门100题之滑动窗口最大值【困难】

    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置

    2024年02月16日
    浏览(39)
  • 【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值

    map|动态规划|单调栈|LeetCode975:奇偶跳 C++算法:滑动窗口总结 单调双向队列 二叉树 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。

    2024年02月04日
    浏览(52)
  • LeetCode 239.滑动窗口的最大值 Hot100 单调栈

    给你一个整数数组  nums ,有一个大小为  k   的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的  k  个数字。滑动窗口每次只向右移动一位。 返回  滑动窗口中的最大值  。 示例 1: 示例 2: 提示: 1 = nums.length = 105 -104 = nums[i] = 104 1 = k = num

    2024年02月20日
    浏览(45)
  • 力扣日记10.30-【栈与队列篇】滑动窗口最大值

    日期:2023.10.30 参考:代码随想录、力扣 题目描述 难度:困难 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 示例 2:

    2024年02月06日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包