A long array A[] is given to you. There is a sliding window of size w which is moving from the very left of the array to the very right. You can only see the w numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example: The array is [1 3 -1 -3 5 3 6 7], and w is 3. |
可以用sparse table做,可以用一个长度为w的有序数组,可以用堆
下面的算法比较精巧
考虑可以发现没有必要每次维护w个数,比如当window是1,2,5,4,3,2时, window
右移一位或两位的时候, 答案都是5, 所以,没必要维护全部数据,维护 5432就ok了.考虑
用一个队列来维护窗口,时间复杂度可以做到O(n)
void AddOne(deque<int>& que, int a[], int i)
{
assert(a && i >= 0);
while (!que.empty() && a[que.back()] < a[i])
que.pop_back();
que.push_back(i);
}
void PrintWindow(int a[], int n, int w)
{
assert(a && n > 0 && w > 0 && n >= w);
deque<int> que;
for (int i = 0; i < w; i++)
AddOne(que, a, i);
cout<<a[que.front()]<<endl;
for (int i = 1; i+w-1 < n; i++)
{
if (i-1 == que.front())
que.pop_front();
AddOne(que, a, i+w-1);
cout<<a[que.front()]<<endl;
}
}