题目地址

https://leetcode-cn.com/problems/min-stack/

题目要求

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

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。
  • *示例 1:**
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    输入:
    ["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.
  • *提示**
  • poptopgetMin操作总是在非空栈上调用。

    解题思路

    数组是有序的,使用双指针法

    需要注意的

  • 常数时间。
  • 注意空栈的情况

    解法一:两个栈

    代码

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    class MinStack {
    int y=0;
    Stack<Integer> stack = new Stack<>();
    Stack<Integer> stackm = new Stack<>();
    /** initialize your data structure here. */
    public MinStack() {
    }
    public void push(int x) {
    stack.push(x);
    if(stackm.size()!=0){
    y=stackm.peek();
    if(y>x){
    stackm.push(x);
    }
    else{
    stackm.push(y);
    }
    }
    else{
    stackm.push(x);
    }
    }
    public void pop() {
    stack.pop();
    stackm.pop();
    }
    public int top() {
    return stack.peek();
    }
    public int getMin() {
    return stackm.peek();
    }
    }
    /**
    * 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();
    */

    两个栈思路

    创建两个栈stackstackm,当有新元素入栈时,直接进入stack,然后比较新元素与stackm栈顶元素的大小,判断进入stackm的元素的值;当有元素出栈时,stackstackm中栈顶元素直接出栈。
    无论何时,stackm的栈顶元素值为stack中元素的最小值。

解法二:一个栈

代码

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
32
33
34
35
36
37
38
39
40
41
class MinStack {
int y=0;
Stack<Integer> stack = new Stack<>();
/** initialize your data structure here. */
public MinStack() {
}
public void push(int x) {
if(!stack.isEmpty()){
y=stack.get(stack.size()-2);
if(y>x){
stack.push(x);
}
else{
stack.push(y);
}
}
else{
stack.push(x);
}
stack.push(x);
}
public void pop() {
stack.pop();
stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return stack.get(stack.size()-2);
}
}

/**
* 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();
*/

一个栈思路

创建栈stack,当有新元素入栈时,先判断新元素与栈顶元素的大小,将小的值入栈,之后新元素入栈,这样栈中数字两两成对。出栈时,两两出栈。
无论何时,stackm的第一层元素值为栈顶值top,第二层元素值为stack中元素的最小值。

评论