1. 程式人生 > >LeetCode 155.最小棧(Min Stack)

LeetCode 155.最小棧(Min Stack)

設計一個支援 push,pop,top 操作,並能在常數時間內檢索到最小元素的棧。

  • push(x) -- 將元素 x 推入棧中。
  • pop() -- 刪除棧頂的元素。
  • top() -- 獲取棧頂元素。
  • getMin() -- 檢索棧中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

   我用的是雙指標,當然也可以用一個 int 值來做下標,表示棧內元素個數。由於是以前寫的,所以getmin函式的複雜度很大。不過可以有更巧妙的方法寫getmin函式。在結構體裡再定義一個int* min,併為之分配一定的記憶體,用來存放最小值,這還不是時間複雜度最低的。如果我們存的不是元素值本身,而是元素值的索引,那麼可以實現更低的時間複雜度。不過每次新增元素時也得更新一下min陣列。

C程式碼:

typedef struct {
    int *base;
    int *top;
} MinStack;

/** initialize your data structure here. */
MinStack* minStackCreate(int maxSize) {
    MinStack* S = (MinStack*)malloc(sizeof(MinStack));
    S->base = (int*)malloc(maxSize*sizeof(int));
    S->top = S->base;
    return S;
}

void minStackPush(MinStack* obj, int x) {
    *obj->top = x;
    obj->top++;
}

void minStackPop(MinStack* obj) {
    obj->top--;
}

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

int minStackGetMin(MinStack* obj) {
    int* temp = obj->top;
    int target = INT_MAX;
    while (temp > obj->base)
    {
        if (*(temp-1) < target)
            target = *(temp-1);
        temp--;
    }
    return target;
}

void minStackFree(MinStack* obj) {
    free(obj->base);
    free(obj);
}

謝謝。