des questions de visage leetcode- pile 30 pour atteindre O (1) La fonction min

idée Dp est d'utiliser la programmation dynamique, à commencer veulent juste garder une structure minimale variable min de la pile à l' intérieur, constamment pousser constamment mis à jour, mais à la station minimale pop, pop incapable de déterminer si la valeur est minime. Penser, une seule variable est certainement pas un record de tous les états minimum, engager dans au moins un réseau.
Par conséquent, la structure de pile minimum qui a une pile d'accès mémoire minimum au minimum, la valeur minimale lorsque le bouton de valeur (la mémoire de la pile au réseau) est également inférieur au courant, nous allons pousser la pile dans la valeur minimale, lorsque lorsque la valeur minimale est supérieure à la pression actuelle, nous copions la poussée minimale précédente à la pile.
Honnêtement, écrit en C leetcode pour moi que moins de code est vraiment une forme d'exercice, et pratique la réalisation de la pile de la chaîne, et une pile de tableau. Pour la programmation dynamique en même temps aussi d'approfondir leur compréhension.
Sur le code:

#define MAX_VALUES 20001

typedef struct StackNode{
    int data;
    struct StackNode* next;
}StackNode,*MinStackPtr;

typedef struct {
    int min_stack[MAX_VALUES];
    int min_stack_top;
    int count;
    MinStackPtr top;
} MinStack;

/** initialize your data structure here. */

MinStack* minStackCreate() {
    MinStack* p=malloc(sizeof(MinStack));
    for(int i=0;i<MAX_VALUES;i++){
        p->min_stack[i]=INT_MAX;
    }
    p->min_stack_top=0;
    p->count=0;
    p->top=NULL;
    return p;
}

void minStackPush(MinStack* obj, int x) {
    MinStackPtr s=malloc(sizeof(StackNode));
    s->data=x;
    s->next=obj->top;
    obj->top=s;
    obj->count++;
    if(x <= obj->min_stack[obj->min_stack_top]){
        obj->min_stack[++obj->min_stack_top]=x;
    }
    else{
        obj->min_stack[obj->min_stack_top+1]=obj->min_stack[obj->min_stack_top];
        obj->min_stack_top++;
    }
}

void minStackPop(MinStack* obj) {
    obj->min_stack_top--;
    if(obj->count==0)
        return;
    MinStackPtr s=obj->top;
    obj->top=obj->top->next;
    free(s);
    obj->count--;
}

int minStackTop(MinStack* obj) {
    return obj->top->data;
}

int minStackMin(MinStack* obj) {
    return obj->min_stack[obj->min_stack_top];
}

void minStackFree(MinStack* obj) {
    MinStackPtr s=obj->top;
    MinStackPtr temp;
    while(s){
        temp=s;
        s=s->next;
        free(temp);
    }
    obj->top=NULL;
    obj->count=0;
}

/**
 * Your MinStack struct will be instantiated and called as such:
 * MinStack* obj = minStackCreate();
 * minStackPush(obj, x);
 
 * minStackPop(obj);
 
 * int param_3 = minStackTop(obj);
 
 * int param_4 = minStackMin(obj);
 
 * minStackFree(obj);
*/
Publié 19 articles originaux · a gagné les éloges 1 · views 3125

Je suppose que tu aimes

Origine blog.csdn.net/qq_41603639/article/details/104890461
conseillé
Classement