滑动窗口最大值
时间: 2023-07-19 11:13:10 浏览: 158
滑动窗口最大值问题是指给定一个长度为 n 的数组 nums 和一个大小为 k 的滑动窗口,从左至右在 nums 中滑动这个窗口,求出每个窗口内的最大值。该问题可以使用双端队列(deque)来解决,具体实现方法可以参考以下代码:
```python
from collections import deque
def maxSlidingWindow(nums, k):
if not nums:
return []
if k == 1:
return nums
res = []
deque = deque()
for i in range(len(nums)):
if deque and i - deque[0] == k:
deque.popleft()
while deque and nums[deque[-1]] < nums[i]:
deque.pop()
deque.append(i)
if i >= k - 1:
res.append(nums[deque[0]])
return res
```
该算法的时间复杂度为 O(n),空间复杂度为 O(k),其中 n 是数组 nums 的长度。
相关问题
滑动窗口最大值c++
滑动窗口最大值是指在一个给定的数组或序列中,每次移动一个小窗口,然后找出窗口内的局部最大值。这个过程通常用于数据处理和算法竞赛中,比如在线查询、实时监控等场景。
在C++中,我们可以用一个变量存储当前找到的最大值,同时维护两个指针,一个指向窗口的开始位置,另一个指向窗口的结束位置。当移动右指针时,如果新元素大于当前最大值,则更新最大值;反之,若新元素不大于前一个元素,说明当前窗口内最大值已经不再增大,可以直接将左指针向右移动一位,这样就减小了窗口大小并保留了最大值。
以下是一个简单的示例代码:
```cpp
#include <vector>
using namespace std;
int maxInWindow(vector<int>& nums, int k) {
if (k <= 0 || nums.empty()) return -1; // 确保窗口大小合法
int left = 0;
int right = k - 1;
int maxVal = nums[left]; // 初始化最大值为左端点数值
while (right < nums.size()) {
if (nums[right] > maxVal) {
maxVal = nums[right];
}
nums[left] = nums[right]; // 移动左指针
left++;
right++;
}
return maxVal;
}
```
在这个例子中,函数`maxInWindow`接收一个整数数组`nums`和窗口大小`k`,返回窗口内的最大值。
python滑动窗口最大值
可以使用双端队列(deque)来实现滑动窗口最大值的问题,具体步骤如下:
1. 定义一个双端队列q,用来存储窗口中的元素下标;
2. 遍历数组nums,每次将队列尾部小于当前元素的下标弹出;
3. 将当前元素的下标加入队列尾部;
4. 判断队列头部的下标是否在当前窗口中,如果不在则弹出;
5. 将队列头部对应的元素作为当前窗口最大值。
具体的 Python 代码实现如下:
```python
from collections import deque
def maxSlidingWindow(nums, k):
if not nums:
return []
q = deque()
res = []
for i in range(len(nums)):
# 如果队列头部下标已经不在窗口中,弹出队列头部
if q and q[0] < i - k + 1:
q.popleft()
# 将队列尾部小于当前元素的下标弹出
while q and nums[q[-1]] < nums[i]:
q.pop()
# 将当前元素下标加入队列尾部
q.append(i)
# 如果当前窗口的大小为k,则将队列头部元素作为当前窗口最大值
if i >= k - 1:
res.append(nums[q[0]])
return res
```
其中,nums表示输入的数组,k表示窗口大小,函数返回一个列表,表示每个窗口的最大值。例如:
```python
>>> nums = [1,3,-1,-3,5,3,6,7]
>>> k = 3
>>> maxSlidingWindow(nums, k)
[3, 3, 5, 5, 6, 7]
```
阅读全文