第一行输入两个整数
。
第二行输入
个整数
,元素范围
。
输出共
个整数,为每个滑动窗口的最大值,数之间以单个空格分隔。
10 3 2 13 6 19 15 13 17 9 19 13
13 19 19 19 17 17 19 19
10 1 13 13 5 3 9 19 18 4 17 3
13 13 5 3 9 19 18 4 17 3
10 10 15 20 5 20 19 1 4 18 14 15
20
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k;
while (cin >> n >> k) {
vector<int> aIntVec(n);
for (int i = 0; i < n; i++) {
cin >> aIntVec[i];
}
//
int leftIndex = 0;
int rightIndex = 0;
// 更新窗口有边界更新最大值
for (int i = 0; i < n; i++) {
leftIndex = i;
rightIndex = leftIndex + k - 1;
int maxValue = 0;
int maxIndex = 0;
if (rightIndex >= n) {
break;
}
for (int j = leftIndex; j <= rightIndex; j++) {
if (maxValue < aIntVec[j]) {
maxValue = aIntVec[j];
maxIndex = rightIndex;
}
}
if (rightIndex < n) {
cout << maxValue << " ";
}
}
}
} import java.util.*;
import java.io.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String[] lineone=bf.readLine().split(" ");
String[] linetwo=bf.readLine().split(" ");
int n=Integer.parseInt(lineone[0]),k=Integer.parseInt(lineone[1]);
int[] arr=Arrays.stream(linetwo).mapToInt(Integer::parseInt).toArray();
Deque<Integer> dq=new LinkedList<>();//维护单调队列
StringJoiner sj=new StringJoiner(" ");
for(int i=0;i<n;i++){
//单调递减
while(!dq.isEmpty()&&arr[dq.peekLast()]<=arr[i]){
dq.pollLast();//队尾安全出队
}
dq.offerLast(i);
//如果队首划过窗口则移除
if(dq.peekFirst()<=i-k){
dq.pollFirst();
}
//够窗口大小时收集元素
if(i>=k-1){
sj.add(arr[dq.peekFirst()]+"");
}
}
System.out.println(sj.toString());
}
}