力扣 滑动窗口最大值

news2024/11/17 13:18:59

滑动窗口最大值

题目描述

在这里插入图片描述

题目分析

维护一个定长窗口的最大值,每当窗口滑动时都有一个新的元素进入和一个原有的元素离开。
比较简单的方法就是用一个优先队列维护窗口最大值
但是堆的计算成本时最坏时是 O ( n log ⁡ n ) O(n\log n) O(nlogn)

优化:

单调队列
相比于堆,堆保留了全部元素,导致维护的成本较高,而单调队列是在保持顺序的情况下只保留符合单调性的元素,不需要重新重新调整结构,换句话说计算的复杂度最坏时为 O ( n ) O(n) O(n)
分块预处理
将所有元素按滑动窗口的大小分块,我们可以得到 [ n / k ] + 1 [n/k] + 1 [n/k]+1个块
为了方便的得到块内最大值,我们可以参考前缀和的方式计算块内的前缀最大值,取 i i i k k k的倍数时就可以取得第 i / k i/k i/k块的最大值
问题在于,滑动窗口不一定就是我们分好的块
所以考虑特殊情况,滑动窗口为 [ i , j ] [i,j] [i,j],设 m ∈ [ i , j ] 且 k ∣ m m \in [i,j] 且 k\mid m m[i,j]km(整除)
p r e m a x [ j ] premax[j] premax[j]表示了 m a x ( n u m s [ m : j ] ) max(nums[m:j]) max(nums[m:j])
现在问题转为了怎么求 m a x ( n u m s [ i : m ) ) max(nums[i:m)) max(nums[i:m))
我们希望用 i i i表示这一段的最大值。注意到 i : m i:m i:m是一种后缀形式,相应的我们可考虑块内的后缀最大值
定义 s u f m a x [ i ] 表示了 m a x ( n u m s [ i : m ) ) sufmax[i]表示了max(nums[i:m)) sufmax[i]表示了max(nums[i:m))

解决问题

1.优先队列

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        priority_queue<pair<int, int>> q;
        for (int i = 0; i < k; ++i) {
            q.emplace(nums[i], i);
        }
        vector<int> ans = {q.top().first};
        for (int i = k; i < n; ++i) {
            q.emplace(nums[i], i);
            while (q.top().second <= i - k) {
                q.pop();
            }
            ans.push_back(q.top().first);
        }
        return ans;
    }
};

2.单调队列

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        deque<int> q;
        for(int i = 0; i < k; ++i){
            while(!q.empty() && nums[i] >= nums[q.back()]){
                q.pop_back();
            }
            q.push_back(i);
        }
        vector<int> ans = {nums[q.front()]};
        for(int i = k; i < n; ++i){
            while(!q.empty() && nums[i] >= nums[q.back()]){
                q.pop_back();
            }
            q.push_back(i);
            while(q.front() <= i - k){
                q.pop_front();
            }
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};

3.分块预处理

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> prefixMax(n), suffixMax(n);
        for (int i = 0; i < n; ++i) {
            if (i % k == 0) {
                prefixMax[i] = nums[i];
            }
            else {
                prefixMax[i] = max(prefixMax[i - 1], nums[i]);
            }
        }
        for (int i = n - 1; i >= 0; --i) {
            if (i == n - 1 || (i + 1) % k == 0) {
                suffixMax[i] = nums[i];
            }
            else {
                suffixMax[i] = max(suffixMax[i + 1], nums[i]);
            }
        }

        vector<int> ans;
        for (int i = 0; i <= n - k; ++i) {
            ans.push_back(max(suffixMax[i], prefixMax[i + k - 1]));
        }
        return ans;
    }
};

总结

优先队列,单调队列,动态维护最值
分块预处理,空间换时间,从整体出发,问题分治,对称性思想

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

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

相关文章

uni-app在线预览pdf

这里推荐下载pdf.js 插件 PDF.js - Browse Files at SourceForge.net 特此注意 如果报 Promise.withResolvers is not a function 请去查看版本兼容问题 降低pdf.js版本提高node版本 下载完成后 在 static 文件夹下新建 pdf 文件夹&#xff0c;将解压文件放进 pdf 文件…

面试加分必看,11道接口安全测试面试题!

今天&#xff0c;分享一些在面试中可能会遇到的接口安全测试面试问题&#xff0c;助你在面试中从容不迫。 01.HTTPS 与 HTTP 的区别&#xff1f; 02.OSI七层模型是指&#xff1f; 03.你所知道的 HTTP 状态码&#xff1f; 04.你知道SQL注入吗&#xff1f; 05.SQL 注入与XSS…

Xiaojie雷达之路---doa估计(dbf、capon、music算法)

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,本篇文章主要是介绍一下雷达信号处理中的dbf、capon、music测角算法,一起来看看吧!!! 前言 本文从信号模型、dbf原理、capon原理、music原理以及代码仿真进行展开描述。 信号模型 阵列接收到…

c++与Python用笛卡尔的心形函数输出爱心

我突然想到输出爱心是否可以用笛卡尔的心形函数 在IDLE里用Python输出下面这个图形 在小熊猫c里用c输出下面这个图形 如果当你要输出这些的时候会怎么办 低级:纯输出 print( ********* ********* ***************** ***************** …

Github + Hexo + Shoka搭建个人博客以及遇到的部分问题

博客预览&#xff1a; 主页&#xff1a; 文章&#xff1a; 博客语言链接&#xff1a; 全部分类 |mmjon 不在能知&#xff0c;乃在能行 Shoka官方博客&#xff1a; Yume Shoka 優萌初華 有夢書架 (lostyu.me) 1、准备 1、github账号 &#xff1a;自行去github官网注册…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中&#xff0c;性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题&#xff0c;我们需要对 MySQL 进行性能剖析。那么&#xff0c;如何在 MySQL 中进行性能剖析呢&#xff1f;本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

$attrs 与 $listeners 怎么用

在组件 son、grandson 和 great-grandson 中都显示了 this is a sentence&#xff0c;而子组件 son 和孙组件 grandson 中都没有定义 props&#xff0c;说明 parent 组件中的数据正确的传递到了内部组件中。 打开控制台&#xff0c;分别点击组件 grandson 和 great-grandson 中…

用Python实现运筹学——Day 5: 单纯形法介绍

一、学习内容 1. 单纯形法的基本原理与步骤 单纯形法&#xff08;Simplex Method&#xff09;是求解线性规划问题的一种常用方法。它是一种迭代算法&#xff0c;用于在凸多边形的顶点上寻找目标函数的最优解&#xff0c;通常用于多变量的线性规划问题。单纯形法主要应用于线性…

如何查看上网记录及上网时间?5种按步操作的方法分享!【小白也能学会!】

“知己知彼&#xff0c;百战不殆”&#xff0c;在数字时代&#xff0c;了解自己的上网行为和时长&#xff0c;不仅能帮助我们更好地管理时间&#xff0c;还能提升工作效率和生活质量。 今天&#xff0c;我们就来分享五种简单易懂的方法&#xff0c;即便是网络小白也能轻松学会…

大模型分布式训练并行技术(九)-总结

近年来&#xff0c;随着Transformer、MOE架构的提出&#xff0c;使得深度学习模型轻松突破上万亿规模参数&#xff0c;传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此&#xff0c;我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。 而利用AI集群&a…

基于Qt/C++UDP 调试软件功能及用途介绍

概述 UDP 调试软件是一个基于 Qt 框架的图形化应用程序&#xff0c;旨在提供一个简单易用的界面用于测试和调试 UDP&#xff08;用户数据报协议&#xff09;通信。该软件支持客户端和服务器模式&#xff0c;能够实现数据的发送和接收&#xff0c;方便开发者和网络工程师进行网…

PG数据库的Jsonb全文检索查询

1.操作键值对 PostgreSQL 对 jsonb 类型的筛选查询可以使用 -> 或者 ->> 操作符。 -> 操作符用于通过 JSON 对象中的键来获取对应的值。->> 操作符可以将获取到的值提取出来转化为字符串类型。 例如&#xff0c;下面是一个包含 jsonb 类型字段的表&#x…

企业IT安全重保服务:守护关键时刻的坚固防线

中国联通国际有限公司产品之IT安全重保服务&#xff1a;守护关键时刻的坚固防线 在数字化时代&#xff0c;信息安全已成为企业运营与国家安全的基石。随着各类重大活动、会议及内部专项工作的频繁举行&#xff0c;如何确保信息系统在关键时刻免受黑客攻击、网页篡改、病毒感染…

零工市场小程序的未来发展趋势

随着经济的发展&#xff0c;越来越多的人们选择了灵活就业的方式来工作&#xff0c;零工市场小程序作为灵活就业一个重要的媒介&#xff0c;未来的发展趋势如何呢&#xff1f; 其实在零工市场小程序中&#xff0c;有着大数据的分析、算法&#xff0c;可以精准的匹配到自由职业…

深度学习常见术语介绍

文章目录 数据集&#xff08;Dataset&#xff09;特征&#xff08;Feature&#xff09;标签&#xff08;Label&#xff09;训练集&#xff08;Training Set&#xff09;测试集&#xff08;Test Set&#xff09;验证集&#xff08;Validation Set&#xff09;模型&#xff08;Mo…

基于Hive和Hadoop的哔哩哔哩网站分析系统

本项目是一个基于大数据技术的哔哩哔哩平台分析系统&#xff0c;旨在为用户提供全面的哔哩哔哩视频数据和深入的用户行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xf…

金镐开源组织成立,增加最新KIT技术,望能为开源添一把火

国内做开源的很多&#xff0c;知名的若依、芋道源码、Pig、Guns等&#xff0c;可谓是百花齐放&#xff0c;虽然比不上Apache&#xff0c;但也大大提高了国内的生产力。经过多年的发展&#xff0c;一些开源项目逐渐也都开始商业化。基于这样的背景&#xff0c;我拉拢了三个技术人…

SO-ELM预测 | MATLAB实现SO-ELM蛇群算法优化极限学习机多输入单输出

回归预测 | MATLAB实现SO-ELM蛇群算法优化极限学习机多输入单输出 目录 回归预测 | MATLAB实现SO-ELM蛇群算法优化极限学习机多输入单输出效果一览基本介绍程序设计效果一览 基本介绍 Matlab实现SO-ELM蛇群算法优化极限学习机多变量回归预测 1.data为数据集,7个输入特征,1个输…

SIGA 气路柜系统VAPORIZER SYSTEM VS-111-321 含电路图

SIGA 气路柜系统VAPORIZER SYSTEM VS-111-321 含电路图