您的位置:首页 > 理论基础 > 数据结构算法

数据结构——滑动窗口练习

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的子数组最大值的更新结构。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: