LeetCode演算法題155:最小棧解析
阿新 • • 發佈:2018-11-11
設計一個支援 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.
這個題比較簡單的想法就是利用兩個棧,一個棧存所有的資料,另一個棧存到每個元素當前的最小值。然後還有一種思路就是一個棧存所有資料,而另一個棧只存不同的最小值,這樣再pop的時候如果當前最小值等於棧頂元素,那麼不僅存所有元素的棧要pop,最小值棧也要pop。還有一種思路就是隻用一個棧,原理是一樣的,如果最小元素更新,那麼就儲存之前的最小元素和當前值,然後更新最小元素,在pop時,如果當前元素等於最小元素,那麼就要pop兩次並更新最小元素。
C++原始碼:
class MinStack {
private:
stack<int> all;
stack<int > min;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
all.push(x);
if (min.size()==0 || min.top()>x)
min.push(x);
else
min.push(min.top());
}
void pop() {
all. pop();
min.pop();
}
int top() {
return all.top();
}
int getMin() {
return min.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
python3原始碼:
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.l = []
self.minNum = sys.maxsize
def push(self, x):
"""
:type x: int
:rtype: void
"""
if x <= self.minNum:
self.l.append(self.minNum)
self.minNum = x
self.l.append(x)
def pop(self):
"""
:rtype: void
"""
if self.l[-1] == self.minNum:
self.l.pop()
self.minNum=self.l[-1]
self.l.pop()
else:
self.l.pop()
def top(self):
"""
:rtype: int
"""
return self.l[-1]
def getMin(self):
"""
:rtype: int
"""
return self.minNum
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()