数据结构和算法经典100题-第32题

题目要求:
一个整形数组arr和一个大小为w的串口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。
例如:数组为【4,3,5,4,3,3,6,7】,窗口大小为3时:
【4,3,5】,4,3,3,6,7 窗口最大值为5
4,【3,5,4】,3,3,6,7 窗口最大值为5
4,3,【5,4,3】,3,6,7 窗口最大值为5
4,3,5,【4,3,3】,6,7 窗口最大值为4
4,3,5,4,【3,3,6】,7 窗口最大值为6
4,3,5,4,3,【3,6,7】 窗口最大值为7

要求实现一个函数:
输入:整形数组attr,窗口大小为w
输出:一个长度为n-w+1的数组res,res[i]表示每个窗口的最大值。


题目解析:
为了保证时间复杂度是O(N),这道题的关键是构造一个双端队列,存储中间过程窗口最大值下标,再细的先不说了,貌似看这个系列博客的人不多,没有一个评论。
Okay,楼主直接给出代码了哦,no code say what:

bool getMaxWindow(const vector<int> &arr,const int w, vector<int> &res) {
    if (arr.empty() || 0 >= w) {
        return false;
    }

    deque<int> qmax;
    int length = (int)arr.size();
    for (int i = 0; i < length; ++i) {
        while (!qmax.empty()) {
            if (arr[i] < arr[qmax.back()]) {
                qmax.push_back(i);
                if (qmax.front() == i - w) {
                    qmax.pop_front();
                }
                break;
            } else {
                qmax.pop_back();
            }
        }

        if (qmax.empty()) {
            qmax.push_back(i);
        }

        if (i >= w - 1) {
            res.push_back(arr[qmax.front()]);
        }
    }

    return true;
}

测试程序:

int main(void) {
    int tmp[] = {4,3,5,4,3,3,6,7};
    vector<int> arr(tmp,tmp+8);
    vector<int> res;
    getMaxWindow(arr, 3, res);

    int len = (int)res.size();
    for (int i = 0; i < len; ++i) {
        cout<<" "<<res[i];
    }
    cout<<endl;
}

测试输出结果:

 5 5 5 4 6 7
Program ended with exit code: 0

路漫漫其修远兮,吾将上下而求索…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值