剑指offer 滑动窗口的最大值

来源:互联网 发布:烈焰遮天源码 编辑:程序博客网 时间:2024/05/17 04:11

1、题目

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};

2、分析

用双端队列存放滑动窗口可能的最大值的下标。注意:是下标,因为需要判断元素是否被移出了窗口。
移动窗口时:
1)若最大值被移出窗口,需要删除最大值
2)若新加入的元素比队尾的元素大,则比该元素小的其他元素不可能成为最大值,依次移除这些元素,把新元素加入队列
3)若新加入的元素比队尾的元素小,该元素也有可能会成为最大值,把它加入队列

3、代码

void maxOfWindow(vector<int> nums, int k) {    vector<int> window;    if (nums.size() > k&&k >= 1) {        deque<int> index;        for (int i = 0; i < k; i++) {//第一个滑动窗口            while (!index.empty() && nums[index.back()] <= nums[i])                index.pop_back();//最大元素下标            index.push_back(i);        }        for (int i = k; i < nums.size(); i++) {            window.push_back(nums[index.front()]);//队首保存最大元素下标            while (!index.empty() && nums[index.back()] <= nums[i])                index.pop_back();            if (!index.empty() && index.front() <= i - k)                index.pop_front();            index.push_back(i);        }        window.push_back(nums[index.front()]);    }    for(int x:window)        cout<<x<<" ";     cout << endl;}
原创粉丝点击