滑动窗口的最大值-LintCode
来源:互联网 发布:新建视图 sql语句 编辑:程序博客网 时间:2024/06/14 23:46
给出一个可能包含重复的整数数组,和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口,找到数组中每个窗口内的最大值。
样例:
给出数组 [1,2,7,7,8], 滑动窗口大小为 k = 3. 返回 [7,7,8].
解释:
最开始,窗口的状态如下:
[|1, 2 ,7| ,7 , 8], 最大值为 7;
然后窗口向右移动一位:
[1, |2, 7, 7|, 8], 最大值为 7;
最后窗口再向右移动一位:
[1, 2, |7, 7, 8|], 最大值为 8.
挑战 :
O(n)时间,O(k)的额外空间
#ifndef C362_H#define C362_H#include<iostream>#include<vector>#include<deque>using namespace std;class Solution {public: /* * @param nums: A list of integers * @param k: An integer * @return: The maximum number inside the window at each moving */ vector<int> maxSlidingWindow(vector<int> nums, int k) { // write your code here vector<int> v; if (nums.empty()) return v; int len = nums.size(); deque<int> deq; for (int i = 0; i < k; ++i) { while (!deq.empty() && nums[i] >= nums[deq.back()])//保证滑动窗口最大值的索引总在队列头部 deq.pop_back(); deq.push_back(i); } for (int i = k; i < len; ++i) { v.push_back(nums[deq.front()]); while (!deq.empty() && nums[i]>nums[deq.back()])//若新值大于队头索引对应的值,则删除元队列中的所有元素,新值的索引为队头;若并不大于,则从队尾减除值比它小的索引,找到其合适的位置 deq.pop_back(); while (!deq.empty() && deq.front() <= i - k)//若队头最大值已滑出窗口,则从队头开始删减,最终把新值添加到队尾 deq.pop_front(); deq.push_back(i); } v.push_back(nums[deq.front()]); return v; }};#endif
阅读全文
0 0
- lintcode-滑动窗口的最大值
- LintCode:滑动窗口的最大值
- lintcode,滑动窗口的最大值
- 滑动窗口的最大值-LintCode
- lintcode滑动窗口最大值
- lintcode(362)滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- SWIFT电文类型及格式
- JavaScript进阶之基础语法
- HDU1166
- Java必知必会及规范
- Java 关于对象之间的比较 , 容器中的数据的排序
- 滑动窗口的最大值-LintCode
- ckeditor实现照片上传功能
- Hibernate框架
- 垂直居中的方式
- 关于Mybatis框架的个人总结
- javascript获取文本框内的内容
- 9-23 数据库内容学习
- Java输入输出
- 双链表基本操作 doubly linked list