文章

栈#中等#最小栈

栈#中等#最小栈

前文

设计一个支持pushpoptop操作,并能在常数时间内检索到最小元素的栈。

实现MinStack类:

1
2
3
4
5
    MinStack() 初始化堆栈对象。
    void push(int val) 将元素val推入堆栈。
    void pop() 删除堆栈顶部的元素。
    int top() 获取堆栈顶部的元素。
    int getMin() 获取堆栈中的最小元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

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

正文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class MinStack {
public:
    MinStack() {

    }
    
    void push(int val) {

    }
    
    void pop() {

    }
    
    int top() {

    }
    
    int getMin() {

    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

解法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class MinStack {
private:
    stack<int> x_stack;
    stack<int> min_stack;
public:
    MinStack() {
        min_stack.push(INT_MAX);
    }
    
    void push(int x) {
        x_stack.push(x);
        min_stack.push(min(min_stack.top(), x));
    }
    
    void pop() {
        x_stack.pop();
        min_stack.pop();
    }
    
    int top() {
        return x_stack.top();
    }
    
    int getMin() {
        return min_stack.top();
    }
};

问题主要在于以O(1)时间复杂度获取最小元素,因此需要以空间换时间, 同时建立一个当前栈长度下的最小元素栈,举例:

1
2
3
4
5
6
7
8
stack: 1
min_stack: 1
stack: 1, 2
min_stack: 1, 1
stack: 1, 2, -1
min_stack: 1, 1, -1
stack: 1, 2, -1, 10
min_stack: 1, 1, -1, -1

如上,因为原始栈pop出栈顶元素后,需要找到剩余最小元素,所以每次压入新元素时, min_stack压入当前长度下最小元素,原始栈pop栈顶元素,则最小元素栈也pop出一个栈顶元素, 因为min_stack的各长度下的栈顶元素则为原始栈相应长度下的最小元素, 所以getMin()只要获取第一个元素返回即可。

本文由作者按照 CC BY 4.0 进行授权

热门标签