LeetCode 155.最小棧(Min Stack)
阿新 • • 發佈:2018-12-20
設計一個支援 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); }
謝謝。