1.26学习总结

文章介绍了如何使用滑动窗口算法解决给定矩阵中每个窗口内最大值的问题,并结合队列数据结构(如先进先出原则)进行分析,展示了C语言中队列的初始化、操作和应用实例。
摘要由CSDN通过智能技术生成

1题目描述

有一个 1×n 的矩阵,有 n 个整数。

现在给你一个可以盖住连续 k 个数的木板。

一开始木板盖住了矩阵的第 1∼k 个数,每次将木板向右移动一个单位,直到右端与第 n 个数重合。

每次移动前输出被覆盖住的数字中最大的数是多少。

输入格式

第一行两个整数 n,k,表示共有 n 个数,木板可以盖住 k 个数。

第二行 

n 个整数,表示矩阵中的元素。

输出格式

共 n−k+1 行,每行一个整数。

第 i 行表示第 i∼i+k−1 个数中最大值是多少。

解析

首先读入整数序列 a 和窗口大小 k。然后,我们定义两个指针 leftright 分别表示滑动窗口的左端点和右端点。初始时,左端点为 0,右端点为 k-1

接下来,我们进入一个循环,每次将窗口向右移动一格,并计算当前窗口内的最大值。具体地,我们通过遍历窗口内的元素,找到最大的元素并记录下来。最后输出当前窗口的最大值。

当窗口滑动到数组末尾时,循环结束,我们得到了所有窗口的最大值。

#include<stdio.h>
int main() {
    int n, k;
    scanf("%d%d", &n, &k);
    int a[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    int left = 0;
    int right = k - 1;
    while (right < n) {
        int max = a[left];

        for (int i = left + 1; i <= right; i++) {
            if (a[i] > max) {
                max = a[i];
            }
        }
        printf("%d\n", max);
        left++;
        right++;
    }
    return 0;
}

2队列

队列(Queue)是一种线性数据结构,它可以看作是一个限定插入和删除的线性表。队列按照先进先出(FIFO)的原则进行插入和删除操作,即先插入的元素先被删除,后插入的元素后被删除。

队列有两个基本操作:入队和出队。入队操作在队列尾部插入元素,出队操作从队列头部删除元素。队列还有一个很常见的操作叫做队列长度,用于获取当前队列中的元素个数。

辅助理解:

假设有一个电影院售票窗口,人们需要排队购买电影票。这里的排队过程就可以看作是一个队列的过程。当一个人来到售票窗口时,他会加入到队列的末尾,即进行了入队操作。当售票员完成一次售票时,队列的第一个人就会被叫到窗口进行购票,完成出队操作。

这个过程符合队列的先进先出原则,最早来到的人先买到票,而后来的人则要等待前面的人都购票完成后才能轮到自己。

下面是关于队列的几个基本术语:

  • 队首(front):队列中第一个元素所在的位置。
  • 队尾(rear):队列中最后一个元素所在的位置。
  • 空队列:不含任何元素的队列。
  • 满队列:队列中的元素个数达到队列的容量上限。

下面是队列的基本操作:

  • 初始化队列:将队列初始化为空队列。
  • 入队操作:向队列中插入一个元素,并将队列尾指针后移。
  • 出队操作:删除队列中的一个元素,并将队列头指针后移。
  • 队列长度操作:获取当前队列中的元素个数。
  • 获取队首元素:获取队列中第一个元素。

队列的应用非常广泛,例如任务调度、消息传递、缓存等场景。在算法领域,队列也是一种非常重要的数据结构,例如广度优先搜索(BFS)和树的层次遍历等算法都可以使用队列来实现

代码辅助解释
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int items[MAX_SIZE];
    int front;
    int rear;
} Queue;

void init(Queue *queue) {
    queue->front = -1;
    queue->rear = -1;
}

int is_empty(Queue *queue) {
    return queue->front == -1;
}

int is_full(Queue *queue) {
    return queue->rear == MAX_SIZE - 1;
}

void enqueue(Queue *queue, int item) {
    if (is_full(queue)) {
        printf("Queue is full.\n");
        return;
    }
    if (is_empty(queue)) {
        queue->front = 0;
    }
    queue->rear++;
    queue->items[queue->rear] = item;
}

int dequeue(Queue *queue) {
    if (is_empty(queue)) {
        printf("Queue is empty.\n");
        return -1;
    }
    int item = queue->items[queue->front];
    if (queue->front == queue->rear) {
        init(queue);
    } else {
        queue->front++;
    }
    return item;
}

int main() {
    Queue queue;
    init(&queue);

    enqueue(&queue, 10); // 入队
    enqueue(&queue, 20);
    enqueue(&queue, 30);
    enqueue(&queue, 40);

    printf("Front element: %d\n", queue.items[queue.front]); // 打印队列头部元素

    int item = dequeue(&queue); // 出队
    if (item != -1) {
        printf("Dequeued item: %d\n", item);
    }

    return 0;
}

该代码使用 C 结构体定义了一个简单的队列数据结构。Queue 结构体包含一个整型数组 items 用于存储队列元素,以及 frontrear 两个指针来表示队列的头部和尾部。

init 函数用于初始化队列,将 frontrear 设置为 -1。

is_empty 函数用于检查队列是否为空,如果 front 等于 -1,则表示队列为空。

is_full 函数用于检查队列是否已满,如果 rear 等于 MAX_SIZE - 1,则表示队列已满。

enqueue 函数用于将元素插入队列的尾部。如果队列已满,则打印提示信息;否则,将 rear 指针移动到下一个位置,并将元素存储在相应的索引处。

dequeue 函数用于从队列的头部删除元素并返回其值。如果队列为空,则打印提示信息并返回 -1;否则,返回头部元素的值,并将 front 指针向前移动。

main 函数中,我们演示了如何使用队列数据结构。首先初始化队列,然后使用 enqueue 函数将元素 10、20、30 和 40 入队。接着打印队列的头部元素,并使用 dequeue 函数将头部元素出队并打印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值