提取每K个子数组中的最大值,难点在于O(n)时间复杂度完成。
参考Discuss发现可以用一个deque维护目前字数组中较大的几个数值,然后取出.front()为最大值。注意deque存的是对应的下标而不是值。
deque队头存的是最大值,每遍历下一个nums的元素,就将其和deque中下标对应的元素比较,从队尾开始,踢除小于目前下标元素的deque中所有元素。
但记住,在此之前要先判断deque的front元素是否为上轮最靠前(此轮需要删除)的元素,如果是,.pop_front()。
代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> deq;
vector<int> res;
for (int i = 0; i < nums.size(); ++i)
{
if (!deq.empty() && deq.front() == i - k)
deq.pop_front();
while (!deq.empty()&& nums[i] >= nums[deq.back()])
deq.pop_back();
deq.push_back(i);
if(i>=k-1)
res.push_back(nums[deq.front()]);
}
return res;
}
};