zoukankan      html  css  js  c++  java
  • leetcode-剑指59-II-OK

    // 剑指59-II
    // language c
    // https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/
    
    typedef struct Node{
        int val;
        struct Node* next;
    } Node;
    
    // 维护两个队列,一个是队列本身,另一个是单调队列
    typedef struct {
        struct Node* head;
        struct Node* tail;
        struct Node* maxhead;
        struct Node* maxtail;
    } MaxQueue;
    
    Node* findpre(Node *a,int x){
        if(a->val <x)
            return NULL;
        Node* pre =a;
        a = a->next;
        while(a){
            if(a->val < x)
                break;
            pre = a;
            a = a->next;
        }
        return pre;
    }
    
    MaxQueue* maxQueueCreate() {
        MaxQueue* A = (MaxQueue*)malloc(sizeof(MaxQueue));
        A->head = NULL;
        A->tail = NULL;
        A->maxhead = NULL;
        A->maxtail = NULL;
        return A;
    }
    
    
    int maxQueueMax_value(MaxQueue* obj) {
        if(obj->maxhead)
            return obj->maxhead->val;
        return -1;
    }
    
    
    void maxQueuePush_back(MaxQueue* obj, int value) {
        Node *newnode = (Node*)malloc(sizeof(Node));
        newnode->val = value;
        newnode->next = NULL;
        Node *newnodeMAX = (Node*)malloc(sizeof(Node));
        newnodeMAX->val = value;
        newnodeMAX->next = NULL;
        if(obj->head== NULL){
            obj->head =newnode;
            obj->tail =newnode;
            obj->maxhead = newnodeMAX;
            obj->maxtail = newnodeMAX;
        }else{
            obj->tail->next = newnode;
            obj->tail = newnode;
            // 接下来维护另一个队列
            if(value <= obj->maxtail->val){
                obj->maxtail->next = newnodeMAX;
                obj->maxtail = newnodeMAX;
            }else{
                Node *pre = findpre(obj->maxhead,value);
                if(pre){
                    pre->next = newnodeMAX;
                    obj->maxtail = newnodeMAX;
                }else{
                    obj->maxtail = newnodeMAX;
                    obj->maxhead = newnodeMAX;
                }
            }
        }
    
    }
    
    int maxQueuePop_front(MaxQueue* obj) {
        if(obj->head == NULL)
            return -1;
        int ans = obj->head->val;
        if(obj->head == obj->tail){
            obj->head = NULL;
            obj->tail = NULL;
            obj->maxtail = NULL;
            obj->maxhead = NULL;
            return ans;
        }else{
            // Node *temp = obj->head;
            obj->head = obj->head->next;
            // free(temp);
            if(ans == obj->maxhead->val)
                obj->maxhead = obj->maxhead->next;
            return ans;
        }
        return -1;
    }
    
    void maxQueueFree(MaxQueue* obj) {
        free(obj);
    }
    
    /**
     * Your MaxQueue struct will be instantiated and called as such:
     * MaxQueue* obj = maxQueueCreate();
     * int param_1 = maxQueueMax_value(obj);
     
     * maxQueuePush_back(obj, value);
     
     * int param_3 = maxQueuePop_front(obj);
     
     * maxQueueFree(obj);
    */
    
  • 相关阅读:
    3.STM32复位系统
    3.CM3内核架构-寄存器
    2.STM32启动文件
    java线程池
    java多线程
    动态规划(dynamic programming)(二、最优子问题与重叠子问题,以及与贪心的区别)
    SOAP协议
    动态规划(dynamic programming)(一、简介,举例)
    红黑树-RBT(二、基本操作之插入)
    红黑树-RBT(二、基本操作之左旋)
  • 原文地址:https://www.cnblogs.com/gallien/p/14334386.html
Copyright © 2011-2022 走看看