题解 | #滑动窗口的最大值#

滑动窗口的最大值

https://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788

#include <cstddef>
#include <stdexcept>
typedef struct QNode{
    int data;
    struct QNode *next;
}QNode, *QueuePtr;

typedef struct{
    QueuePtr front;
    QueuePtr rear;
}LinkQueue;

int InitQueue(LinkQueue &Q){
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if(!Q.front) exit(-1);
    Q.front->next = NULL;
    return 1;
}

int DeQueue(LinkQueue &Q){
    if(Q.front == Q.rear) return 0;
    QueuePtr p = Q.front->next;
    Q.front->next = p->next;
    if(Q.rear == p) Q.rear = Q.front;
    free(p);
    return 1;
}

int EnQueue(LinkQueue &Q, int e){
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p) exit(-1);
    p->data = e;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
    return 1;
}

void Max(LinkQueue &Q, vector<int> &max, int size, int n){
    if(size==1) {
        max[n] = Q.front->next->data;
        return;
    } else{
        QueuePtr p = Q.front->next;
        max[n] = p->data;
        for(int i = 0;i<size-1;i++){
        if(max[n]<p->next->data)  max[n] = p->next->data;
        p = p->next;
        }
    }
}

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
        int n = num.size();
        vector<int> max(n-size+1);
        if((size==0)||(size>n)) return {};
        LinkQueue Q;
        InitQueue(Q);
        for(int i=0;i<size;i++){
            EnQueue(Q, num[i]);
        }
        Max(Q, max, size, 0);
        for(int i = 1;i<n-size+1;i++){
            DeQueue(Q);
            EnQueue(Q, num[size+i-1]);
            Max(Q, max, size, i);
        }
        return max;
    }
};

#华为OD机试##c++##单链队列##结构体##引用#
全部评论
4h
点赞 回复 分享
发布于 2023-01-30 00:24 陕西

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
一颗宏心:华为HR晚上过了十二点后还给我法消息。
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务