这个是单调队列的入门题目。值得注意的一点是队列中的数的index是单调递增的,所以从队首删除的时候从前向后循环找到第一个index满足>= i - k + 1条件的元素作为队首元素就可以了,这也是我一开始没想明白的一点。
1 //#include "stdafx.h" 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 int n, k, a[1000005], q[1000005]; 7 void max_value() 8 { 9 int front = 0, end = 0; 10 for (int i = 0; i < n; i++) 11 { 12 while (a[q[end]] <= a[i] && end >= front) 13 { 14 end--; 15 } 16 q[++end] = i; 17 while (q[front] < i - k + 1 && front < end) 18 { 19 front++; 20 } 21 if (i >= k - 1) 22 printf("%d ", a[q[front]]); 23 } 24 puts(""); 25 } 26 void min_value() 27 { 28 int front = 0, end = 0; 29 for (int i = 0; i < n; i++) 30 { 31 while (a[q[end]] >= a[i] && end >= front) 32 { 33 end--; 34 } 35 q[++end] = i; 36 while (q[front] < i - k + 1 && front < end) 37 { 38 front++; 39 } 40 if (i >= k - 1) 41 printf("%d ", a[q[front]]); 42 } 43 puts(""); 44 } 45 int main() 46 { 47 cin >> n >> k; 48 for (int i = 0; i < n; i++) 49 { 50 scanf("%d", &a[i]); 51 } 52 min_value(); 53 memset(q, 0, sizeof(q)); 54 max_value(); 55 //system("pause"); 56 return 0; 57 }