給定乙個長度為n的數列a,再給定乙個長度為k的滑動視窗,從第乙個數字開始依次框定k個數字,求每次框定的數字中的最大值和最小值,依次輸出所有的這些值。下面有乙個例子陣列是 [1 3 1 3 5 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 3 6] 7 3 6
1 3 -1 -3 5 [3 6 7] 3 7
第一行包含兩個整數 n 和 k ,分別表示陣列的長度和滑動視窗長度。
第二行n個整數,表示數列元素的值。
第一行從左到右視窗看到的最小值。
第二行從左到右視窗看到的最大值。
8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7
30%:n<=100 k<=20
60%:n<=5000 k<=20
100%:n<=10^6,每個元素不操過int型別
需要讀入輸出優化
題解:單調佇列%%%
#include #include#include
#include
using
namespace
std;
deque
q; deque
q2;int a[1000005],mmin[1000005],mmax[1000005
];int
n,k;
void putmax(int
x)
while(!q.empty()&&x-q.front()>=k)
q.push_back(x);
}void putmin(int
x)
while(!q2.empty()&&x-q2.front()>=k)
q2.push_back(x);
}int
main ( )
} for(int i=1;i<=num;i++)
printf("\n
");for(int i=1;i<=num;i++)
printf("\n
");
return0;
}
47 滑行的視窗
給定乙個長度為n的數列a,再給定乙個長度為k的滑動視窗,從第乙個數字開始依次框定k個數字,求每次框定的數字中的最大值和最小值,依次輸出所有的這些值。第一行包含兩個整數 n 和 k 分別表示陣列的長度和滑動視窗長度。第二行n個整數,表示數列元素的值。第一行從左到右視窗看到的最小值。第二行從左到右視窗看...