剑指offer 滑动窗口的最大值
2017-09-17 01:24
218 查看
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; }
相关文章推荐
- 【剑指offer】题65:滑动窗口最大值
- 剑指offer 机器人的运动范围 矩阵中的路径 滑动窗口最大值 次数超过一半的数 连续子数组的最大和
- 剑指offer--面试题65:滑动窗口的最大值
- 剑指offer-滑动窗口的最大值
- 剑指offer 编程题(60):滑动窗口最大值
- [剑指offer]滑动窗口的最大值
- (C++)剑指offer-64:滑动窗口是最大值(栈和队列)
- 剑指offer之65 滑动窗口的最大值问题
- 剑指offer-----滑动窗口的最大值(java版)
- 剑指offer64:滑动窗口的最大值
- 剑指offer:滑动窗口的最大值
- 剑指offer 滑动窗口的最大值
- 剑指offer——滑动窗口的最大值
- 【剑指offer】面试题59(1):滑动窗口的最大值
- 剑指Offer—64—滑动窗口的最大值
- 剑指Offer(59)滑动窗口最大值
- 剑指offer — 滑动窗口的最大值
- 剑指offer 面试题65 滑动窗口的最大值
- 剑指offer_滑动窗口的最大值
- 剑指offer_滑动窗口的最大值