给定一个整数数组 nums
和一个整数 k
,定义一个大小为 k
的滑动窗口,该窗口从数组的最左侧移动到最右侧。你可以看到在滑动窗口内的 k
个数字,并返回滑动窗口中的最大值。
我们可以利用一个双端队列 deque
来解决这个问题。在滑动窗口的过程中,我们需要做以下几件事情:
deque
,用来存储数组元素的索引。class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> dq = {};
vector<int> result = {};
for (int i = 0; i < nums.size(); i++) {
// 插入数值
while (!dq.empty() && nums[dq.back()] <= nums[i]) {
dq.pop_back();
}
dq.push_back(i); // 入队
// 滑动窗口右移
if (i - dq.front() >= k) { // 队首已经离开窗口了
dq.pop_front();
}
// 记录答案
if (i >= k - 1) {
// 由于队首到队尾单调递减,所以窗口最大值就是队首
result.push_back(nums[dq.front()]);
}
}
return result;
}
};
本文介绍了一种使用双端队列来解决滑动窗口最大值的问题的方法。通过维护一个单调递减的双端队列,可以在 O ( n ) O(n) O(n) 的时间复杂度内解决该问题,其中 n n n 是数组的长度。这种方法在面对滑动窗口问题时具有较高的效率和可读性,是一种常见的解题思路。