Skip to content

Commit 525862d

Browse files
committed
add 155
1 parent 4f153a1 commit 525862d

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
| # | Title |
8484
| :--: | :------------------------------------------ |
8585
| 384 | [Shuffle an Array][384] |
86+
| 155 | [Min Stack][155] |
8687

8788

8889
[leetcode]: https://leetcode.com/problemset/all/
@@ -127,3 +128,4 @@
127128
[053]: https://github.com/andavid/leetcode-java/blob/master/note/053/README.md
128129
[198]: https://github.com/andavid/leetcode-java/blob/master/note/198/README.md
129130
[384]: https://github.com/andavid/leetcode-java/blob/master/note/384/README.md
131+
[155]: https://github.com/andavid/leetcode-java/blob/master/note/155/README.md

note/155/README.md

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# [Min Stack][title]
2+
3+
## Description
4+
5+
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
6+
7+
* push(x) -- Push element x onto stack.
8+
* pop() -- Removes the element on top of the stack.
9+
* top() -- Get the top element.
10+
* getMin() -- Retrieve the minimum element in the stack.
11+
12+
**Example:**
13+
14+
```
15+
MinStack minStack = new MinStack();
16+
minStack.push(-2);
17+
minStack.push(0);
18+
minStack.push(-3);
19+
minStack.getMin(); --> Returns -3.
20+
minStack.pop();
21+
minStack.top(); --> Returns 0.
22+
minStack.getMin(); --> Returns -2.
23+
```
24+
25+
## 思路
26+
27+
最容易想到的思路是,使用两个 Stack,一个栈正常 push 和 pop 数据,另外一个辅助栈只压入当前栈的最小值。
28+
29+
也可以只使用一个栈。需要记录当前最小值,每次压入一个数时,如果它比当前最小值大,直接压入栈;如果比当前最小值还小,那么先压入当前最小值,然后更新当前最小值,最后再压入新的最小值。出栈的时候,如果值等于当前最小值,那么需要再次出栈,并更新当前最小值。
30+
31+
## [完整代码][src]
32+
33+
```java
34+
class MinStack {
35+
int min;
36+
Stack<Integer> stack;
37+
38+
public MinStack() {
39+
min = Integer.MAX_VALUE;
40+
stack = new Stack<Integer>();
41+
}
42+
43+
public void push(int x) {
44+
if (x <= min) {
45+
stack.push(min);
46+
min = x;
47+
}
48+
stack.push(x);
49+
}
50+
51+
public void pop() {
52+
if (stack.pop() == min) {
53+
min = stack.pop();
54+
}
55+
}
56+
57+
public int top() {
58+
return stack.peek();
59+
}
60+
61+
public int getMin() {
62+
return min;
63+
}
64+
}
65+
```
66+
67+
[title]: https://leetcode.com/problems/min-stack
68+
[src]: https://github.com/andavid/leetcode-java/blob/master/src/com/andavid/leetcode/_155/Solution.java
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import java.util.*;
2+
3+
class Solution {
4+
5+
public static class MinStack {
6+
int min;
7+
Stack<Integer> stack;
8+
9+
public MinStack() {
10+
min = Integer.MAX_VALUE;
11+
stack = new Stack<Integer>();
12+
}
13+
14+
public void push(int x) {
15+
if (x <= min) {
16+
stack.push(min);
17+
min = x;
18+
}
19+
stack.push(x);
20+
}
21+
22+
public void pop() {
23+
if (stack.pop() == min) {
24+
min = stack.pop();
25+
}
26+
}
27+
28+
public int top() {
29+
return stack.peek();
30+
}
31+
32+
public int getMin() {
33+
return min;
34+
}
35+
}
36+
37+
public static void main(String[] args) {
38+
MinStack minStack = new MinStack();
39+
minStack.push(-2);
40+
minStack.push(0);
41+
minStack.push(-3);
42+
System.out.println(minStack.getMin());
43+
minStack.pop();
44+
System.out.println(minStack.top());
45+
System.out.println(minStack.getMin());
46+
}
47+
}

0 commit comments

Comments
 (0)