滑动窗口最大值
时间: 2023-07-19 11:13:04 浏览: 38
滑动窗口最大值问题可以用双端队列来解决,具体实现如下:
1. 创建一个双端队列deque,用来存储窗口中的元素下标
2. 遍历整个数组,如果双端队列不为空且队首元素已经不在当前窗口中,则将队首元素弹出
3. 将当前元素下标加入双端队列尾部,如果队列中的元素个数大于窗口大小,则将队首元素弹出
4. 如果当前元素下标已经大于等于窗口大小-1,则将双端队列的队首元素对应的数组元素作为当前窗口的最大值
参考代码如下:
```
vector<int> maxInWindows(const vector<int>& nums, int k) {
vector<int> res;
deque<int> dq;
for (int i = 0; i < nums.size(); ++i) {
if (!dq.empty() && dq.front() < i - k + 1) dq.pop_front();
while (!dq.empty() && nums[dq.back()] < nums[i]) dq.pop_back();
dq.push_back(i);
if (i >= k - 1) res.push_back(nums[dq.front()]);
}
return res;
}
```
其中,时间复杂度为O(n),空间复杂度为O(k)。
相关问题
滑动窗口最大值python
滑动窗口最大值问题,可以使用双端队列来解决。双端队列中存放的是窗口中的元素的索引值,而且队列中的元素按照从大到小的顺序排列。具体算法如下:
1. 创建一个双端队列 deque,用来存放窗口中的元素的索引值。
2. 初始化结果数组 res,用来存放每个窗口中的最大值。
3. 遍历整个数组,做如下操作:
a. 检查队列中的头部元素是否已经越过窗口的范围,如果是,则删除头部元素。
b. 判断当前元素是否比队列中的尾部元素大,如果是,则将尾部元素删除,直到队列为空或者队列中的元素比当前元素大。
c. 将当前元素的索引加入队列的尾部。
d. 判断当前窗口是否已经形成,如果是,则将队列中的头部元素加入结果数组 res。
4. 返回结果数组 res。
下面是用 Python 实现的代码:
```python
from collections import deque
def slidingWindowMax(nums, k):
deque = deque()
res = []
for i in range(len(nums)):
if deque and i - deque[0] == k:
deque.popleft()
while deque and nums[i] > nums[deque[-1]]:
deque.pop()
deque.append(i)
if i >= k - 1:
res.append(nums[deque[0]])
return res
```
以上就是滑动窗口最大值问题的 Python 解法。该算法的时间复杂度为 O(n),其中 n 是数组的长度。
python滑动窗口最大值
可以使用双端队列来实现滑动窗口最大值的查找,具体步骤如下:
1. 创建一个双端队列,用于保存滑动窗口中的元素下标,队列中的元素按照从大到小的顺序排列。
2. 遍历整个数组,对于每个元素,进行以下操作:
a. 如果队列非空且队列中第一个元素的下标小于等于当前元素下标与窗口大小之差,说明队列中第一个元素已经不在窗口中了,将其从队列中删除。
b. 将当前元素下标加入队列中。
c. 如果队列中最后一个元素的下标小于等于当前元素下标,说明队列中最后一个元素不可能成为窗口内的最大值,将其从队列中删除。
d. 如果当前元素下标大于等于窗口大小减1,说明已经形成了一个完整的窗口,将队列中第一个元素对应的元素作为当前窗口的最大值。
代码实现如下:
```python
from collections import deque
def max_sliding_window(nums, k):
n = len(nums)
if not nums or k <= 0 or k > n:
return []
# 初始化双端队列,保存的是元素下标
q = deque()
res = []
for i in range(n):
# 如果队列非空且队列中第一个元素的下标小于等于当前元素下标与窗口大小之差,说明队列中第一个元素已经不在窗口中了,将其从队列中删除。
if q and q[0] <= i - k:
q.popleft()
# 将当前元素下标加入队列中。
while q and nums[q[-1]] < nums[i]:
q.pop()
q.append(i)
# 如果当前元素下标大于等于窗口大小减1,说明已经形成了一个完整的窗口,将队列中第一个元素对应的元素作为当前窗口的最大值。
if i >= k - 1:
res.append(nums[q[0]])
return res
```
例如,对于数组 `[1,3,-1,-3,5,3,6,7]`,窗口大小为 3,滑动窗口最大值为 `[3,3,5,5,6,7]`。