找每个窗口中的最大值

来源:互联网 发布:淘宝设置客服 编辑:程序博客网 时间:2024/06/07 07:43

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;        }}


原创粉丝点击