滑动窗口 题目描述 给定一个大小为 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 ≤ 数组中每个元素的值 ≤ 106C语言解决
时间: 2024-04-17 10:26:25 浏览: 221
在C语言中,我们可以使用双端队列来解决滑动窗口的最小值和最大值问题。
下面是使用C语言实现的代码示例:
```c
#include <stdio.h>
// 定义双端队列结构体
typedef struct {
int data[1000005]; // 双端队列的数组存储元素
int front, rear; // 队列的前后指针
} Deque;
// 初始化双端队列
void initDeque(Deque *dq) {
dq->front = 0;
dq->rear = -1;
}
// 检查双端队列是否为空
int isEmpty(Deque *dq) {
return dq->front > dq->rear;
}
// 检查双端队列的第一个元素
int getFront(Deque *dq) {
return dq->data[dq->front];
}
// 检查双端队列的最后一个元素
int getRear(Deque *dq) {
return dq->data[dq->rear];
}
// 将元素从双端队列的前端入队
void pushFront(Deque *dq, int val) {
dq->data[--dq->front] = val;
}
// 将元素从双端队列的后端入队
void pushRear(Deque *dq, int val) {
dq->data[++dq->rear] = val;
}
// 将双端队列的第一个元素出队
void popFront(Deque *dq) {
dq->front++;
}
// 将双端队列的最后一个元素出队
void popRear(Deque *dq) {
dq->rear--;
}
// 求滑动窗口的最小值和最大值
void slidingWindow(int nums[], int n, int k) {
Deque dq;
initDeque(&dq);
// 存储最小值和最大值的数组
int res_min[1000005], res_max[1000005];
int idx = 0;
for (int i = 0; i < n; i++) {
// 移除滑动窗口最左边的元素
if (!isEmpty(&dq) && getFront(&dq) < i - k + 1) {
popFront(&dq);
}
// 移除队列中小于等于当前元素的元素
while (!isEmpty(&dq) && nums[i] >= nums[getRear(&dq)]) {
popRear(&dq);
}
// 将当前元素加入队列
pushRear(&dq, i);
// 记录滑动窗口的最小值和最大值
if (i >= k - 1) {
res_min[idx] = nums[getFront(&dq)];
res_max[idx] = nums[getRear(&dq)];
idx++;
}
}
// 输出结果
for (int i = 0; i < idx; i++) {
printf("%d ", res_min[i]);
}
printf("\n");
for (int i = 0; i < idx; i++) {
printf("%d ", res_max[i]);
}
}
int main() {
int n, k;
int nums[1000005];
// 读取输入
scanf("%d %d", &n, &k);
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
// 调用函数并输出结果
slidingWindow(nums, n, k);
return 0;
}
```
希望对你有帮助!
阅读全文