滑动窗口的最大值
题目
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
思路
设置双端队列存放可能成为最大值的数字对应的下标:
- 队列中只存有可能成为最大值的i数字对应的index,所以如果队尾元素比下一个元素小,就一直出队
- 同时控制队头元素与当前元素的距离不大于窗口长度
- 从存在滑动窗口开始,每次输出队头元素
C++
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
deque<int> dq;
vector<int> res;
for(int i=0; i<n; ++i)
{
while(!dq.empty() && i-dq.front()+1>k)
dq.pop_front();
while(!dq.empty() && nums[dq.back()]<=nums[i]) // 只存有可能成为最大值的数字的index进deque
dq.pop_back();
dq.push_back(i);
if(i>=k-1)
res.push_back(nums[dq.front()]);
}
return res;
}
};
python
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
deque, res = [], []
for i in range(len(nums)):
while deque and nums[i]>nums[deque[-1]]: #只存有可能成为最大值的数字的index进deque
deque.pop()
deque.append(i)
while i-deque[0] > k-1: # 超过窗口长度
deque.pop(0)
if i>=k-1: # 从i>滑动窗口的大小开始,每一次都新添加一个最大值
res.append(nums[deque[0]])
return res