560.滑动窗口最大值

news2024/10/5 19:20:44

滑动窗口最大值

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

题目大意,返回每个窗口内的最大值。

在这里插入图片描述

思路-优先队列

优先队列(堆),其中的大根堆可以实时维护一系列元素中的最大值。

每当我们向右移动窗口时,我们就可以把一个新的元素放入优先队列中,此时堆顶的元素就是堆中所有元素的最大值。然而这个最大值可能并不在滑动窗口中,我们不断地移除堆顶的元素,直到其确实出现在滑动窗口中。

时间复杂度:O(nlogn)。在最坏情况下,数组 nums 中的元素单调递增,那么最终优先队列中包含了所有元素,没有元素被移除。维护优先队列的时间复杂度为 O(logn),因此总时间复杂度为 O(nlogn)

空间复杂度:O(n),即为优先队列需要使用的空间。

代码

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        // 优先队列,保存值和下标,按值维护大根堆
        priority_queue<pair<int, int>> q;
        vector<int> res;
        int n = nums.size();
        
        for(int i = 0; i < n; i ++) {
            // 加入堆
            q.push({nums[i], i});
            
            // 如果这个最大值已经是之前窗口的,就丢弃
            while (q.top().second <= i - k) {
                q.pop();
            }

            // 每次保存当前最大的数
            if(i >= k - 1)
                res.push_back(q.top().first);
        }

        return res;
    }
};

思路-单调队列

  • 一个窗口内最需要关注的就只有最大值。比如窗口[1 3 -1]中,我们只关注最大值3。换句话说,对于1-1来说,因为窗口内存在比他大的数,那他们本身其实在本窗口没什么作用。

    既然其他的没什么作用,那只需要保存最大值其他值就不管咯?

    也不是,因为这些值可能在后面的窗口有作用。比如,上述[1 3 -1]的下两个窗口假如是[-1 -3 -5],那-1就是最大值了。

  • 考虑后续多个窗口,则需要降序维护多个“最大值”。如上所述,结合窗口内的最大值才被关注有比我大的值我就需要隐忍(避其锋芒,暂居幕后)可以分析出这题适合使用单调队列。

单调队列中维护现在能用到或将来能用到的“最大值们”,最多k个,空间复杂度为O(k)

遍历数组每个元素一次,维护单调队列(每个元素最多入队出队一次),时间复杂度为O(n + n),即O(n)

代码

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        // 单调双端队列, 按实际值递减存储
        // 保存的是下标
        deque<int> d;
        vector<int> res;
        int n = nums.size();
        
        for(int i = 0; i < n; i ++) {
            // 判断队列维护的跨度是否超过k了。超过了代表是之前窗口的元素,已经用不到了
            if(d.size() && i - d.front() >= k)
                d.pop_front();
            // 把比自己小的数都踢出去,因为只要自己在,就轮不到比他小别的当大哥
            // 一样大的踢不踢都行
            while(d.size() && nums[d.back()] < nums[i]) {
                d.pop_back();
            }
            d.push_back(i);

            // 每次保存当前最大的数
            if(i >= k - 1)
                res.push_back(nums[d.front()]);
        }

        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1868871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode中快捷生成自定义vue3模板

需求描述 新建 vue 文件后&#xff0c;需要先写出 vue3 的基础架构代码&#xff0c;手动输入效率低下&#xff01; 期待&#xff1a;输入 v3 按 Tab 即刻生成自定义的vue3模板&#xff08;如下图&#xff09; 实现流程 vscode 的设置中&#xff0c;选择 用户代码片段 输入 vue…

windows远程桌面你会了吗?

1、当你发现正常连接无法连接时&#xff1f; 试试以管理员身份连接 mstsc /admin /v:IP 2、当本机与远程桌面分辨率不一致时? 指定分辨率连接&#xff0c;如1920*1080 mstsc /w:1920 /h:1080 /v:IP 适应本机分辨率连接 mstsc /span /v:IP 3、当远程连接的端口不是3389…

边缘计算VNC智能盒子如何助力HMI设备实现二次开发?

HMI&#xff08;Human-Machine Interface&#xff09;又称人机界面&#xff0c;是用户与机器之间交互和通信的媒介。今天带你了解智能盒子如何助力HMI设备实现二次开发&#xff1f; HMI设备被广泛应用在工业自动化中&#xff0c;具有显示设备信息&#xff0c;实时监测&#xf…

高德.js2.0绘制多条折线(轨迹)及清除所有折线

2.0版本的地图,需要绘制多条折线的时候,就需要循环生成,因此也需要循环清除 for (let j 0; j < combinedArray.length; j) {const item combinedArray[j];this.polyline new AMap.Polyline({map: this.map,path: item,showDir: true,strokeColor: "#28F", //线…

海豚调度调优 | 如何解决任务被禁用出现的Bug

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益。 本系列教程基于 DolphinScheduler 2.0.5 做的优化。&#xff…

将某列缺失分隔符的文字读入 Excel

有个逗号分隔的 txt&#xff0c;共 10 列&#xff0c;第 3 列有时候缺少分隔符&#xff0c;导致该列缺失&#xff0c;数据不齐只剩 9 列。比如最后两行&#xff1a; 01-0104-0133,MAYO, RONIE #2,202403,2024-03-21 22:51:43.000,1449.49,0.00,0.00,08,6CC6BDAC7E45 17-1782-02…

MyBatis-在分步查询的基础上配置懒加载

Hibernate中&#xff0c;涉及到关联查询的时候&#xff0c;懒加载是默认就开启着的&#xff0c;前面讲过设计懒加载就是&#xff0c;在关联查询中&#xff0c;真正需要用到关联的对象的时候&#xff0c;才发起sql语句&#xff0c;从数据库中查询数据&#xff0c;从而实现提升数…

Django安装与启动

1、Django是什么&#xff1f; 基于python的Web开发框架&#xff0c;支持用户快速开发安全、可维护的网站 2、怎么安装&#xff1f; pip install Django4.2 3、如何启动&#xff1f; 不写ip和端口时候&#xff0c;默认启动http://127.0.0.1:8000/ python .\manage.py runse…

uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮

ml-fab 插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id18909 1、可拖拽悬浮按钮 ml-fab&#xff0c;支持自定义插槽&#xff0c;点击可展开一个图标按钮菜单&#xff0c;可随意拖拽。 2、支持自定义插槽&#xff0c;可实现自定义配置。 3、操作简单易上手。 ml-f…

197.回溯算法:复原IP地址(力扣)

代码解决 class Solution { public:// 存储最终结果的向量vector<string> result;// 判断字符串s从start到end范围内的子串是否是一个合法的IP地址段bool isValid(const string& s, int start, int end){if (start > end) {return false; // 起始位置大于结束位置…

设计师必备的交互原型图软件

如果你是UI/UX设计师&#xff0c;你肯定会在工作中涉及到交互原型图的设计。在设计交互原型图时&#xff0c;我们通常需要找到一些适合自己的交互原型图设计软件来制作高质量的交互原型图。那么我们应该如何选择合适的交互原型图设计软件呢&#xff1f;来自10年的高级交互设计师…

定制化、精细化、场景化AI训练数据趋于基础数据服务市场主流

算法、算力和数据共同构成了AI产业链技术发展的三大核心要素。在人工智能行业发展进程中&#xff0c;有监督的深度学习算法是推动人工智能技术取得突破性发展的关键技术理论&#xff0c;而大量训练数据的支撑则是有监督的深度学习算法实现的基础。算法模型从技术理论到应用实践…

stencil 组件

stencil 组件 装饰器生命周期应用加载事件 组件定义组件如何响应数据变化 组件使用如何传递 slot如何暴露组件内部的方法供外部使用&#xff1f;Element 装饰器 Host 组件样式函数组件 stencil 提供一些装饰器、生命周期钩子和渲染函数去编写一个组件。 装饰器 装饰器是一组用…

第 3 章使用图像和标签

现在您已经对 SwiftUI 有了基本的了解,并了解了如何显示文本内容,现在是时候学习如何在应用中显示图像了。在本章中,我们将探讨Label最常见的用户界面组件之一的用法,以及Image用于在屏幕上渲染图像的视图。与上一章中所做的类似,我将通过构建一个简单的演示向您展示如何使…

Navicat 外网连接 mysql (1、通过SSH方式内网访问 2、对外开放3306端口)

1、通过SSH方式内网访问 直接常规方式使用IP、账号密码连接&#xff0c;失败 SSH方式&#xff1a; 常规 选项卡中&#xff1a;localhost录入数据库账号密码 SSH 选项卡中&#xff1a;勾选使用SSH&#xff0c;输入服务器IP、账号、密码 如果出现该错误&#xff0c;可能是服务器…

会计报表分析

目录 一. 会计报表的种类 \quad 一. 会计报表的种类 \quad 反应财务状况的是资产负债表 反应经营成果的是利润表 有时间点的就是静态表 动态表就是有一个区间的, 比如一年, 一个季度等

PLC网关如何选择?plc网关作用-天拓四方

一、PLC网关在工业自动化领域的重要性和作用 PLC网关在工业自动化领域的重要性和作用不言而喻。作为工业自动化系统的重要组成部分&#xff0c;PLC网关起到了关键的桥梁作用&#xff0c;实现了PLC与其他设备、系统之间的数据传输和通信。 首先&#xff0c;PLC网关的重要性体现…

5G赋能安防视频监控:EasyCVR视频汇聚融合创新技术,共筑多场景安全防线

随着科技的快速发展&#xff0c;第五代移动通信技术&#xff08;5G&#xff09;已逐渐成为我们生活中的重要组成部分。其中&#xff0c;5G技术以其超高速、低延迟、大连接数的特点&#xff0c;正在深刻改变着我们的生活方式和社会运行模式。安防监控领域作为社会安全的重要组成…

如何实现智慧农田的精准灌溉

如何实现智慧农田的精准灌溉 智慧农田的精准灌溉是现代农业技术发展的重要组成部分&#xff0c;它集成了物联网、大数据分析、人工智能以及现代水利技术&#xff0c;旨在通过实时监测土壤湿度、气象条件及作物生长状况&#xff0c;实现水资源的高效利用和作物产量、品质的双重…

智慧海洋灾害监测预警系统解决方案

一、概述 近年来&#xff0c;我国海洋经济持续增长&#xff0c;为我国综合国力带来了新机遇。但是&#xff0c;每年由于海洋灾害带来的损失也不可忽略&#xff0c;这些灾害包括&#xff1a;风暴潮、海浪、海冰、海啸动力环境灾害、赤潮、绿潮等等。针对目前海洋监管力量薄弱&am…