当前位置: 首页 > news >正文

【Hot100】239. 滑动窗口最大值

目录

  • 引言
  • 滑动窗口最大值
    • 暴力求解解题
    • 采用优先级队列优化

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:【Hot100】239. 滑动窗口最大值
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

引言

滑动窗口最大值

  • 🎈 题目链接:
  • 🎈 做题状态:一开始想到一个暴力求解

暴力求解解题

暴力求解,这种时间复杂度有点高。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if (nums.size() < k) return {};
        
        // 暴力计算,时间复杂度O(n*k)
        vector<int> result;
        for (int i = 0; i <= nums.size() - k; ++i)
        {
            int maxV = nums[i];
            for (int j = i; j < i + k; ++j)
            {
                maxV = max(maxV, nums[j]);
            }
            result.push_back(maxV);
        }
        return result;
    }
};

采用优先级队列优化

在最开始想着要维护一个最大值,想到了使用优先级队列适配器来实现,但是优先级队列只能移除队列顶部元素,不能给定一个值让其移除。所以当滑动窗口右移时,需要将左边界的值给移除掉。

所以如何直到队列中维护的数据是否处于滑动窗口中就很关键。这里使用优先级队列存储 pair<int, int> {value: index} 根据index来判断是否处于滑动窗口的左边界的左侧。这是一个很巧妙的地方。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if (nums.size() < k) return {};
        
        vector<int> result;
        priority_queue<pair<int, int>> pq;

        // 首先插入k个元素
        for (int i = 0; i < k; ++i)
        {
            pq.push({nums[i], i});
        }
        result.push_back(pq.top().first);

        // 遍历剩余的元素
        for (int i = k; i < nums.size(); ++i)
        {
            // 首先将当前滑动窗口右边界的元素插入到优先级队列中
            pq.push({nums[i], i});

            // 然后再判断当前优先级队列中的最大值是否是位于左边界的左侧,如果是则循环移除。
            // 因为可能需要移除多次,如果之前左侧数值小于最大值是不会被移除的,所以这里得循环移除
            while(pq.top().second < i - k + 1)
            {
                // index < i - k + 1 时说明当前index处于左边界左侧
                pq.pop();
            }

            // 再将最大值添加到结果中
            result.push_back(pq.top().first);
        }

        return result;
    }
};

相关文章:

  • Express中间件(Middleware)详解:从零开始掌握(4)
  • 高级java每日一道面试题-2025年4月07日-微服务篇[Nacos篇]-如何监控Nacos的运行状态?
  • 深入探究AI编程能力:ChatGPT及其大规模模型的实现原理
  • 纯PHP编写的聊天室无需数据库,上传虚拟空间就可使用
  • 【PostgreSQL教程】PostgreSQL 特别篇之 语言接口连接PHP
  • [LeetCode 45] 跳跃游戏2 (Ⅱ)
  • Python高级爬虫之JS逆向+安卓逆向1.4节:数据运算
  • Solidity私有函数和私有变量区别,私有变量可以被访问吗
  • 在轨道交通控制系统中如何实现μs级任务同步
  • KiCad 9.0:如何在 PCB 上暴露铜皮(开窗)
  • go中new和make有什么异同?
  • [LeetCode 1306] 跳跃游戏3(Ⅲ)
  • AD利用转换工具快速生成异形焊盘
  • 从Ampere到Hopper:GPU架构演进对AI模型训练的颠覆性影响
  • TLA:用于接触-丰富操作的触觉-语言-动作模型
  • Profibus DP转ModbusTCP网关通讯案例解析
  • Arrays.asList() 隐藏的陷阱
  • 论文导读 | 基于GPU的子图匹配算法
  • #4 我们为什么使用物联网? 以及 物联网的整体结构
  • Python六大数据类型与可变类型
  • 北理工:开除宫某党籍,免去行政职务,解除聘用关系
  • 老旧高层遭“连环漏水”,如何携手共治解难题?
  • 碎片化时代如何阅读?巴金图书馆推出世界读书日系列活动
  • 三一重工去年净利增逾三成至59.75亿,拟分红超30亿元
  • 道客网络陈齐彦:技术无界化,开源让AI变成了“全民食堂”
  • 中华民族共同体体验馆第二期在北京开展,上海体验区展现人民城市与民族团结交融之美