数据结构——滑动窗口练习
2017-05-23 15:19
267 查看
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个:
{[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
思路:用双端队列,实现窗口最大值的更新,生成双端队列,qmax={},双端队列中存放着数组中的下标值,假设当前数为arr[i],放入规则如下:
1、如果qmax为空,直接把下标i放入qmax中
2、如果qmax不为空,去当前qmax存放的下标j,如果arr[j]>arr[i],直接把下标i放进qmax的队尾,放入过程直接结束。
3、如果arr[j]<=arr[i],则一直从amax的队尾弹出下标,知道某个下标在array中对应的值大于arr[i],把i放入qmax的队尾。
假设当前数组arr[i],弹出规则为:
如果qmax对头的下标等于i-w,说明当前队头下标已经过期,则弹出qmax当前队头下标,根据如上放入弹出规则,可知qmax成为一个维护窗口为w的子数组最大值的更新结构。
{[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
思路:用双端队列,实现窗口最大值的更新,生成双端队列,qmax={},双端队列中存放着数组中的下标值,假设当前数为arr[i],放入规则如下:
1、如果qmax为空,直接把下标i放入qmax中
2、如果qmax不为空,去当前qmax存放的下标j,如果arr[j]>arr[i],直接把下标i放进qmax的队尾,放入过程直接结束。
3、如果arr[j]<=arr[i],则一直从amax的队尾弹出下标,知道某个下标在array中对应的值大于arr[i],把i放入qmax的队尾。
假设当前数组arr[i],弹出规则为:
如果qmax对头的下标等于i-w,说明当前队头下标已经过期,则弹出qmax当前队头下标,根据如上放入弹出规则,可知qmax成为一个维护窗口为w的子数组最大值的更新结构。
vector<int> slide(vector<int> arr, int n, int w) {//返回的是一个 deque<int> qmax; vector<int> res; int j=0; for (int i = 0; i < n; i++) { if (qmax.empty()) qmax.push_back(i);//若队列中是空的 else { while (!qmax.empty() && arr[qmax.back()] < arr[i]) { qmax.pop_back();//若 } qmax.push_back(i);//若当前的数字比较小,则放进去 } if (i >=(w - 1)) { while (qmax.front()<i - w+1)//当前队头下标已经过期了删除 qmax.pop_front(); res.push_back(arr[qmax.front()]); } } return res; } viod main() { vector<int> arr = { 4,3,5,4,3,3,6,7 }; int n, w; n = 8; w = 3; vector<int> res = slide(arr, n, w); for(int i=0;i<6;i++) { cout << res[i]; } }
python解法:
class Solution: def maxInWindows(self, num, size): if len(num)<size or size<1: return [] res=[] for i in range(0,len(num)-size+1): res.append(max(num[i:i+size])) return res
相关文章推荐
- 回顾大学--大二数据结构实验--实验一 递归练习
- 数组引用做形参练习(数据结构test3)
- 【算法学习笔记】07.数据结构基础 链表 初步练习
- 【算法学习笔记】10.数据结构基础 二叉树初步练习3(遍历与递归复习)
- 【算法学习笔记】09.数据结构基础 二叉树初步练习2
- c++练习004之数据结构(顺序表操作)
- 数据结构之二叉树练习
- hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)
- 机器学习&数据挖掘笔记_24(PGM练习八:结构学习)
- 【算法学习笔记】11.数据结构基础 二叉树初步练习4
- C primer plus第14章(结构和其他数据形式)(练习)
- 第三章数程序设计初步--控制结构综合项目4-2文件操作初体验练习4将数据写入文件
- 第三章数程序设计初步--控制结构综合项目4-2文件操作初体验练习3将数据写入文件
- 【算法学习笔记】07.数据结构基础 链表 初步练习
- 数据结构与程序设计 练习3.3 E7
- 数组引用做形参练习(数据结构test3)
- 第三章数程序设计初步--控制结构综合项目4-2文件操作初体验练习2从文件读取数据
- 数据结构与程序设计练习2.2E2(b)
- 【算法学习笔记】08.数据结构基础 二叉树初步练习1
- 【算法学习笔记】11.数据结构基础 二叉树初步练习4