问题1:滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
思路: 利用deque存放滑动窗口中有可能成为最大值的索引值。
从deque后面依次弹出比当前num[i]小的值,保证deque队首元素为当前窗口最大值索引,压入nums[i]。
当当前窗口滑过窗口最大值索引时,弹出最大值索引。
代码:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int len=nums.size();
vector<int> res;
if(len==0||k<1) // 异常值测试
return res;
if(k<=len)
{
deque<int> index;
for(int i=0;i<k;++i)
{
while(!index.empty()&&nums[i]>=nums[index.back()])
index.pop_back();
index.push_back(i);
}
for(int i=k;i<len;i++)
{
res.push_back(nums[index.front()]);
while(!index.empty()&&nums[i]>=nums[index.back()])
index.pop_back();
while(!index.empty()&&index.front()<=i-k)
index.pop_front();
index.push_back(i);
}
res.push_back(nums[index.front()]);
}
return res;
}
};
复杂度分析:时间复杂度为O(n),空间复杂度为O(n).
问题2:队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1。
思路:利用deque,基于上述题的思想。