class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); ++i) {
if (!q.empty() && q.front() == i - k) q.pop_front();
while (!q.empty() && nums[q.back()] < nums[i]) q.pop_back();
q.push_back(i);
if (i >= k - 1) res.push_back(nums[q.front()]);
}
return res;
}
};
时间复杂度为O(n)。提示我们要用双向队列deque来解题,并提示我们窗口中只留下有用的值,没用的全移除掉。果然Hard的题目我就是不会做,网上看到了别人的解法才明白,解法又巧妙有简洁,膜拜啊。大概思路是用双向队列保存数字的下标,遍历整个数组,如果此时队列的首元素是i - k的话,表示此时窗口向右移了一步,则移除队首元素。然后比较队尾元素和将要进来的值,如果小的话就都移除,然后此时我们把队首
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k)
{
deque<int> dq;
vector<int> result;
int len = nums.size();
for (int i = 0 ; i < len ; i++)
{
//当前窗口是[i-k+1, i-k+2, ... i-1, i ](i>=k-1时),如果队头不在这个范围内,则丢弃
if (!dq.empty() && dq.front() < i-k+1)
dq.pop_front();
//把队列中小的删掉,保持队列递减
while (!dq.empty() && nums[dq.back()] < nums[i])
dq.pop_back();
dq.push_back(i);
//从k-1开始,每次的队头就是最大值
if (i >= k-1)
result.push_back(nums[dq.front()]);
}
return result;
}
};
---------------------
作者:思翊
来源:CSDN
原文:https://blog.csdn.net/u012243115/article/details/47035643
版权声明:本文为博主原创文章,转载请附上博文链接!
元素加入结果中即可