滑动窗口 题目描述 给定一个大小为 n≤106 的数组。有一个大小为 k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k个数字。每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。 窗口位置 最小值 最大值 [1 3 -1] -3 5 3 6 7 -1 3 1 [3 -1 -3] 5 3 6 7 -3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 1 3 -1 -3 [5 3 6] 7 3 6 1 3 -1 -3 5 [3 6 7] 7 你的任务是确定滑动窗口位于每个位置时,窗口中的最大值和最小值。 输入格式 输入包含两行。 第一行包含两个整数 n 和 k,分别代表数组长度和滑动窗口的长度。 第二行有 n个整数,代表数组的具体数值。同行数据之间用空格隔开。 输出格式 输出包含两个。 第一行输出,从左至右,每个位置滑动窗口中的最小值。 第二行输出,从左至右,每个位置滑动窗口中的最大值。 数据范围 1 ≤ n < 106 1 ≤ k ≤ n -106 ≤ 数组中每个元素的值 ≤ 106
时间: 2024-04-17 07:26:25 浏览: 123
这是一个典型的滑动窗口问题。我们可以使用双端队列来解决这个问题。
算法如下:
1. 初始化一个双端队列dq用于存储每个滑动窗口的元素下标。
2. 遍历数组,对于每个元素arr[i],执行以下步骤:
a. 如果dq不为空且dq的第一个元素不在当前滑动窗口中(即dq的第一个元素小于i-k+1),则将dq的第一个元素移出队列。
b. 当dq不为空且arr[i]大于等于数组中下标为dq的最后一个元素对应的值时,将dq的最后一个元素移出队列。
c. 将i加入dq的末尾。
d. 如果滑动窗口的大小大于等于k,则将当前滑动窗口的最小值(即数组中下标为dq的第一个元素对应的值)加入结果列表。
e. 如果滑动窗口的大小大于等于k,则将当前滑动窗口的最大值(即数组中下标为dq的最后一个元素对应的值)加入结果列表。
3. 返回结果列表作为输出。
下面是使用Python实现的代码示例:
```python
from collections import deque
def sliding_window(nums, k):
n = len(nums)
dq = deque()
res_min = []
res_max = []
for i in range(n):
# 移除滑动窗口最左边的元素
if dq and dq[0] < i - k + 1:
dq.popleft()
# 移除队列中小于等于当前元素的元素
while dq and nums[i] >= nums[dq[-1]]:
dq.pop()
# 将当前元素加入队列
dq.append(i)
# 记录滑动窗口的最小值和最大值
if i >= k - 1:
res_min.append(nums[dq[0]])
res_max.append(nums[dq[-1]])
return res_min, res_max
# 读取输入
n, k = map(int, input().split())
nums = list(map(int, input().split()))
# 调用函数并输出结果
res_min, res_max = sliding_window(nums, k)
print(' '.join(map(str, res_min)))
print(' '.join(map(str, res_max)))
```
希望对你有帮助!
阅读全文