python
暴力法,遇到很大的输入数组时会超时。
class Solution:
def maxSlidingWindow(self, nums: List[int], size: int):
n = len(nums)
if size > n or size == 0:
return []
res = []
left, right = 0, size-1
while right < n:
res.append(max(nums[left:right+1]))
left += 1
right += 1
return res
利用双端队列记录当前滑动窗口的元素索引(注意collections.deque()比原始list快很多)
队列最左侧元素记录滑动窗口中最大元素的索引
遍历数组:
- 如果队列最左侧索引已不在滑动窗口范围内,弹出队列最左侧索引
- 通过循环确保队列的最左侧索引所对应元素值最大
- 新元素入队
- 从第一个滑动窗口的末尾索引开始将最大值存储到结果res中
import collections
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int):
queue = collections.deque()
res = []
for i, num in enumerate(nums):
if queue and queue[0] == i-k:
queue.popleft()
while queue and nums[queue[-1]] < num:
queue.pop()
queue.append(i)
if i >= k-1:
res.append(nums[queue[0]])
return res
c++
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
// 滑动窗口
deque<int> dq;
vector<int> res;
int n = nums.size();
int left = 0, right = 0;
while (right < n) {
int num = nums[right];
// 扩大窗口
while (!dq.empty() && nums[dq.back()] < num) {
dq.pop_back();
}
dq.push_back(right);
right++;
// 缩小窗口
while (right - left >= k) {
res.push_back(nums[dq.front()]);
if (dq.front() == left) {
dq.pop_front();
}
left++;
}
}
return res;
}
};