滑动窗口中的最大值

#include <iostream>
#include <vector>
#include <deque>

using namespace std;

//滑动窗口中的最大值
/*
给定一个数组和滑动窗口的大小,
找出所有滑动窗口里数值的最大值。
例如,如果输入数组{2,3,4,2,6,2,5,1}
及滑动窗口的大小3,那么一共存在6个滑动窗口,
他们的最大值分别为{4,4,6,6,6,5};
 针对数组{2,3,4,2,6,2,5,1}
 的滑动窗口有以下6个:
{[2,3,4],2,6,2,5,1},
{2,[3,4,2],6,2,5,1},
{2,3,[4,2,6],2,5,1},
{2,3,4,[2,6,2],5,1},
{2,3,4,2,[6,2,5],1},
{2,3,4,2,6,[2,5,1]}。
*/
/*
解题思路:
双端队列解决该问题,
用队列开头控制窗口大小,
如果窗口大小大于等于窗口大小时,
则删除队列开头元素,
而对于队列尾端用于与输入数据作比较,
如果大于队列尾端元素,
则将尾端元素抛掉,
直到当前元素小于等于尾端元素为止,
这样便能够保证双端队列开头元素值肯定是最大。
*/
//data为数组,size为窗口大小,result为结果(要用引用的形式)
int MaxNums(vector<int> data, int Size, vector<int>& result)
{
    //检查参数
    if (data.empty() || Size <= 1 ||!result.empty())
        return -1;//-1代表程序出现错误

    //创建一个双端队列
    deque<int> dataIndex;

    //先输入开头size个数据
    for (int i = 0; i < Size; i++)
    {
        //当deque队列不为空且最后一个元素小于要插入的元素
        while (!dataIndex.empty() && data[i] >= data[dataIndex.back()])
        {
            dataIndex.pop_back();
        }
        dataIndex.push_back(i);//插入的是这个数据的索引
    }

    //从size个数据开始往后遍历
    for (int i = Size; i < data.size(); i++)
    {
        result.push_back(data[dataIndex.front()]);
        //要插入的数据大于双端队列的队尾,则删除双端队列的队尾
        while (!dataIndex.empty() && data[i] >= data[dataIndex.back()])
        {
            dataIndex.pop_back();//删除双端队列的队尾
        }
        //当前的索引与双端队列的开头元素相差大于等于size时,说明队列开头已经不再窗口中了
        if (!dataIndex.empty() && (i - dataIndex.front()) >= Size)
        {
            //将双端队列中第一个元素移出
            dataIndex.pop_front();
        }
        dataIndex.push_back(i);
    }
    result.push_back(data[dataIndex.front()]);//最后还有一个元素
    return 0;
}

int main()
{
    vector<int> vect{ 2,3,4,2,6,2,5,1,9 };
    int Size = 3;
    vector<int> result;
    if (MaxNums(vect, Size, result) == 0)//返回0,代表正常运行
    {
        for (auto res : result)
        {
            cout << res << endl;
        }
    }
    return 0;
}

参考:https://blog.csdn.net/weixin_39485901/article/details/91493277

原文地址:https://www.cnblogs.com/xcxfury001blogs/p/12382120.html

时间: 2024-10-17 15:50:13

滑动窗口中的最大值的相关文章

滑动窗口中最大值

[要求]有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置. 返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值. 以数组为[4,3,5,4,3,3,6,7],w=3为例.因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5.第四个窗口[4,3,3]的最大值为4.第五个窗口[3,3,6]的最大值为6.第六个窗口[3,6,7]的最大值为7.所以最终返回[5,5

滑动窗口的最大值问题

给出一个序列,要求找出滑动窗口中的最大值,比如: # 序列: 2, 6, 1, 5, 3, 9, 7, 4 # 窗口大小: 4 [2, 6, 1, 5], 3, 9, 7, 4 => 6 2, [6, 1, 5, 3], 9, 7, 4 => 6 2, 6, [1, 5, 3, 9], 7, 4 => 9 2, 6, 1, [5, 3, 9, 7], 4 => 9 2, 6, 1, 5, [3, 9, 7, 4] => 9 # 期望结果: [6, 6, 9, 9, 9] 并要

剑指offer:滑动窗口的最大值(栈和队列)

1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}: 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],

Leetcode 239题 滑动窗口最大值(Sliding Window Maximum) Java语言求解

题目链接 https://leetcode-cn.com/problems/sliding-window-maximum/ 题目内容 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置|最大值 -|- [1 3 -1] -3 5

leetcode 239. 滑动窗口最大值(单调队列)

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 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

关于双端队列 deque 模板 &amp;&amp; 滑动窗口 (自出)

嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include <cstdio> 2 #include <iostream> 3 #include <deque> 4 //实际上,引用queue头文件也可以,里面包含了deque头文件 5 6 using namespace std; 7 8 deque<int> dq; //定义

AcWing 154. 滑动窗口(模板)

(https://www.acwing.com/problem/content/156/) 给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7],k为3. 窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 3 1 3 [-1 -3 5] 3 6 7 -

【单调队列】--滑动窗口

题目链接 给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 -1 -3 5 3 6 7],k为3. 窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 3 1 3 [-1 -3 5] 3 6 7 -3 5 1 3 -1 [-3 5 3] 6 7 -3 5 1 3 -1 -3 [5

堆的相关题目—滑动窗口

1.数据流滑动窗口平均值 描述 给出一串整数流和窗口大小,计算滑动窗口中所有整数的平均值. 样例 样例1 : MovingAverage m = new MovingAverage(3); m.next(1) = 1 // 返回 1.00000 m.next(10) = (1 + 10) / 2 // 返回 5.50000 m.next(3) = (1 + 10 + 3) / 3 // 返回 4.66667 m.next(5) = (10 + 3 + 5) / 3 // 返回 6.00000来源