找每个窗口中的最大值

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值