力扣 剑指 Offer 59 - I. 滑动窗口的最大值 单调队列

力扣239 - 滑动窗口最大值单调队列的原理】 对应力扣239 - 滑动窗口最大值,带你搞懂单调队列的实现原理 阅读详情

https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/
在这里插入图片描述

思路:单调队列。顾名思义,具有单调性的队列。比如这道题,我们可以维护一个单调递减的队列,即保证最大值在队首,那么就可以在 O ( 1 ) O(1) O(1)内找到滑动窗口的最大值。但是光维护单调性是不行滴,因为滑动窗口有大小限制呀,比如这道题就是 k k k,那么我们需要计算当前位置与队首元素所在位置的索引差,看它与 k k k的大小关系,如果超过了 k k k,就需要弹出队首的元素。思路有了,怎么实现呢? ( 1 ) (1) (1)既然同时需要索引和值,不如搞一个 p a i r pair pair同时存储这两个数据,再放到队列里就行了。 ( 2 ) (2) (2)已知索引和原数组,那么值很容易获得,所以可以直接搞一个队列,里面放索引就完事了。下面的代码用的就是后面的办法。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> ans;
        int siz=nums.size();
        if(!siz)
            return ans;
        //arr存储下标 维护单调非升队列
        int arr[siz];
        //队头队尾
        int fon=0,bak=0;
        for(int i=0;i<k;i++){
            //队列非空 维护单调非升这一性质
            while(fon<bak&&nums[i]>nums[arr[bak-1]])
                --bak;
            arr[bak++]=i;
        }  
        ans.push_back(nums[arr[fon]]);
        for(int i=k;i<siz;i++){
            //超出滑动窗口的大小k 需要进行出队操作
            if(i-arr[fon]+1>k)
                ++fon;
            //同上
            while(fon<bak&&nums[i]>nums[arr[bak-1]])
                --bak;
            arr[bak++]=i;
            ans.push_back(nums[arr[fon]]);
        }
        return ans;
    }
};

啥?不想手写队列,那就用 d e q u e deque deque吧。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> ans;
        int siz=nums.size();
        if(!siz)
            return ans;
        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);
        }  
        ans.push_back(nums[q.front()]);
        for(int i=k;i<siz;i++){
            //超出滑动窗口的大小k 需要进行出队操作
            if(i-q.front()+1>k)
                q.pop_front();
            //同上
            while(!q.empty()&&nums[i]>nums[q.back()])
                q.pop_back();
            q.push_back(i);
            ans.push_back(nums[q.front()]);
        }
        return ans;
    }
};
单调队列-力扣-239. 滑动窗口最大值 题目链接 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 . 阅读详情

相关推荐

三种方法教你下载大模型到本地,总有一种适合你

本文主要介绍了下载大模型到本地的三种解决方案,希望能对同学们有所帮助。 文章目录 1. 场景/问题描述 2. 方案一:使用git 3. 方案二:镜像站 4. 方案三:高速下载工具(变体及自定义代码) 4.1 aria2 4.2 自定义代码

weixin_43178406的博客 15万+

单调队列—————力扣239题

今天讲一种数据结构----单调队列。其实就是队列的特殊版本。队列里面的数,要么递增,要么递减。

jack黄从零学c++的博客 448

BVH2SMPL 实战笔记

BVH2SMPL 实战笔记

jacke121的专栏 820

算法刷题记录——单调栈&单调队列

法一:从右到左看!

m0_69064462的博客 314

力扣239. 滑动窗口最大值单调队列

摘要:本文介绍利用单调队列解决滑动窗口最大值问题。通过维护一个双端队列,确保队列中的元素下标对应值单调递减。算法在窗口滑动时处理三个步骤:移除越界元素、删除比当前元素小的值、添加新元素。当窗口形成后,队首即为当前窗口最大值。时间复杂度为O(n),空间复杂度为O(k)。示例代码展示了具体实现过程,通过遍历数组动态维护单调队列,最终返回所有滑动窗口最大值集合。

tsb2416443_的博客 243

leetcode总结-单调队列题型总结

文章目录题型关键字解题步骤 单调队列是在单调栈上的拓展,单调队列中元素单调,。注意与优先级队列进行区分。 单调队列的性质: 寻找最大最小值时间复杂度小于 O(n),可以起到优化作用 单调队列初始时没有元素需要添加元素,以后每次变动队列不可能存在空的情况,只有在初始化队列中第一个元素时候为空 单调队列首位变动,中间元素不变动 题型 一个序列只有头尾的数据有变动,需要求该序列的最大值或最小值,可以...

abcnull 的博客 1445

leetcode 剑指 Offer 59 - I. 滑动窗口最大值 & **239. 滑动窗口最大值单调队列

【题目】 同 239. 滑动窗口最大值(困难) 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 ...

Sophia_fez的博客 633

剑指offer Leetcode 59 - I. 滑动窗口最大值(deque单调队列)

解法1:暴力法 思想: ​ 遍历每个滑动窗口,找出其中的最大值 复杂度: ​ ●时间:O((N - k + 1)k) = O(Nk),每个窗口k个数,总共有N - k + 1个窗口 ​ ●空间: 解法2:单调队列 https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-i-hua-dong-chuang-kou-de-zui-da-1-6/ 思想: ​ 用deque维护一.

ziggy7的博客 234

【LeetCode笔记】剑指Offer 59. I 滑动窗口最大值(Java、单调队列

文章目录题目描述思路 && 代码1. 暴力法 O(n2n^2n2) && O(1)2. 单调队列辅助 O(n) && O(n) 打卡第十天~ 题目描述 久违的滑动窗口题! 思路 && 代码 1. 暴力法 O(n2n^2n2) && O(1) 老规矩,先来个暴力法熟悉一下题目~ 出乎意料没有超时…不过我们还是需要寻找更优的做法! class Solution { public int[] maxSliding

只能说希望每日一更 222

剑指 Offer 59 - I. 滑动窗口最大值 / LeetCode 239. 滑动窗口最大值(优先队列 / 单调队列

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

WorldMaya的博客 312

使用单调队列

力扣剑指offer第二版遇到一个滑动窗口的题目: Offer-59-I.滑动窗口 我的暴力解法如下: class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if(nums.length == 0){ return new int[]{}; } int left = 0,right=k-1,count = nums.length -right;

weixin_52526235的博客 137

Leetcode剑指Offer刷题 - 第二十七天

Leetcode剑指Offer刷题指南: Leetcode剑指Offer刷题-学习计划目录_DEGv587的博客-CSDN博客 剑指 Offer 59 - I. 滑动窗口最大值 解法一:暴力模拟 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 0) return new int[0]; int len = nums.lengt..

DEGv587的博客 393

python--剑指offer--简单--59 - I. 滑动窗口最大值

from typing import List class Solution: def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]: deque = collections.deque() res, n = [], len(nums) for i, j in zip(range(1 - k, n + 1 - k), range(n)): ...

Chasing__Dreams的博客 446

2021-08-16

剑指 Offer 59 - I. 滑动窗口最大值 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7

weixin_52746566的博客 108

剑指 Offer59-I-滑动窗口最大值

问题描述 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1

Java硬件工程师的博客 1621

单调队列 | 滑动窗口 | 动态规划:力扣239. 滑动窗口最大值

1、题目描述: 2、题解: 方法1:单调栈 方法2:滑动窗口 3、复杂度分析:

weixin_42042056的博客 433

leetcode.单调栈,单调队列

单调栈是什么? 找出数组中每个数右边第一个比它大的元素 单调递增栈 我们用栈来保存未找到右边第一个比它大的元素的索引(保存索引是因为后面需要靠索引来给新数组赋值) #include<iostream> #include<stack> #include<vector> using namespace std; vector<int> RightFirstGreater(vector<int>nums) { vector<int>

John的博客 245

leetcode算法题--滑动窗口最大值

原题链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/ 滑动窗口: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int n = nums.size(); if (n == 0 || k == 0) return {}; deque<int> dq; vector&

bob的博客 329

力扣题239:滑动窗口最大值:优先队列,单调队列

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

dddgggd的博客 291

【LeetCode刷题(困难程度)】剑指 Offer 59 - I. 滑动窗口最大值

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6

qq_33197518的博客 167

SPSS 强大的统计分析软件

1. 核心功能与特点​​操作便捷性​​:图形化界面无需编程,通过菜单和对话框即可完成数据管理、统计分析及可视化。​​统计方法全面​​:覆盖描述性统计、回归分析、因子分析、生存分析等百余种方法,支持高级建模(如Logistic回归、聚类分析)。​​数据兼容性强​​:可直接导入Excel、文本文件及数据库数据,支持跨平台处理。2. 典型应用场景​​问卷调查分析​​:从信效度检验(α系数、KMO值)到相关回归分析,输出结果可直接用于学术论文。​​科研与商业决策​​:适用于医学、心理学、经济学等领域,例如通过ANOVA检验组间差异,或利用因子分析降维。

上一篇: 力扣 面试题 17.09. 第 k 个数 队列/set
下一篇: 力扣 621. 任务调度器 贪心/思维
csu_xiji
博客等级 码龄9年 181粉丝 1147原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值