- 题目
- 题解(21)
- 讨论(8)
- 排行
中等 通过率:49.56% 时间限制:3秒 空间限制:256M
知识点双指针

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
给定一个长度为 nn 的整数数组 aa 和一个窗口大小 kk (1≦k≦n)(1≦k≦n)。滑动窗口从左到右移动,每次右移一位(窗口覆盖下标 [i,i+k−1][i,i+k−1])。对于数组的每一个窗口位置,求出窗口内元素的最大值。
输入描述:
第一行输入两个整数 n,k(1≦k≦n≦2×105)n,k(1≦k≦n≦2×105)。
第二行输入 nn 个整数 a1,a2,...,ana1,a2,...,an,元素范围 1≦ai≦1091≦ai≦109。
输出描述:
输出共 n−k+1n−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
cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
//输入数据
int n, k;
cin >> n >> k;
vector<int> a;//接受数组
for(int i = 0; i < n; i++){
int tmp;
cin >> tmp;
a.push_back(tmp);
}
//双指针遍历序列a,同时用loc指针记录历史最大值位置
int loc = -1;
int left = 0;
int right = k - 1;
while(right < n){
int max = 0;//存储最大值
if(loc >= left){//loc还在窗口内只需要比较最新的值和loc指向的值的大小并更新max和loc的值
max = a.at(loc);
if(a.at(right) > max){
max = a.at(right);
loc = right;
}
}
else{//loc不在窗口内就遍历新窗口获取max值并更新loc值
for(int j = left; j <= right; j++){
if(a.at(j) > max){
max = a.at(j);
loc = j;
}
}
}
cout << max << " ";
left++;
right++;
}
cout << endl;
return 0;
}
// 64 位输出请用 printf("%lld")