首页 > 试题广场 >

【模板】滑动窗口

[编程题]【模板】滑动窗口
  • 热度指数:2144 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个长度为 n 的整数数组 a 和一个窗口大小 k (1\leqq k\leqq n)。滑动窗口从左到右移动,每次右移一位(窗口覆盖下标 [i,i+k-1])。对于数组的每一个窗口位置,求出窗口内元素的最大值。

输入描述:
\hspace{15pt}第一行输入两个整数 n,k\left(1\leqq k\leqq n\leqq 2\times10^{5}\right)
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots ,a_n,元素范围 1 \leqq a_i \leqq 10^{9}


输出描述:
\hspace{15pt}输出共 n-k+1 个整数,为每个滑动窗口的最大值,数之间以单个空格分隔。
示例1

输入

10 3
2 13 6 19 15 13 17 9 19 13

输出

13 19 19 19 17 17 19 19
示例2

输入

10 1
13 13 5 3 9 19 18 4 17 3

输出

13 13 5 3 9 19 18 4 17 3
示例3

输入

10 10
15 20 5 20 19 1 4 18 14 15

输出

20
#include <stdio.h>
#include <stdlib.h>

int main() {

    //这题是给一个固定的窗口,每次找这个窗口的最大值,好像挺简单的

    int n, k;
    scanf("%d %d", &n, &k);
    int *array=malloc(sizeof(int)*n);

    for(int i=0;i<n;i++)
    {
        scanf("%d", &array[i]);
        //printf("%d ", array[i]);
    }

    //双指针划出一个固定窗口
    for(int i=0;i+k<=n;i++)
    {
        int max=0;//记录最大值
        for(int j=i;j<i+k;j++)  //在这个窗口里找最大值
        {
            if(array[j]>max)
            {
                max=array[j];
            }
        }
        printf("%d ",max);
    }
   
    return 0;
}
发表于 2025-10-03 14:34:50 回复(0)