初夏小谈:LC.155:最小栈(O(1)时间每次可以返回栈中元素的最小值)
题目:
设计一个支持 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元素时比较方便。只有在找到压最小元素时才会出栈。
代码:
class MinStack { public: /** initialize your data structure here. */ MinStack() { } //(_minst.empty() void push(int x) { _st.push(x); if(_minst.empty() || _st.top()<=_minst.top()) { _minst.push(x); } } void pop() { if(_st.top() == _minst.top()) { _minst.pop(); } _st.pop(); } int top() { return _st.top(); } int getMin() { return _minst.top(); } stack<int> _st; stack<int> _minst; }; /** * 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(); */
运行显示:
珍&源码