forked from fishercoder1534/Leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_716.java
106 lines (95 loc) · 2.89 KB
/
_716.java
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package com.fishercoder.solutions;
import java.util.Iterator;
import java.util.Stack;
/**
* 716. Max Stack
*
* Design a max stack that supports push, pop, top, peekMax and popMax.
*
push(x) -- Push element x onto stack.
pop() -- Remove the element on top of the stack and return it.
top() -- Get the element on the top.
peekMax() -- Retrieve the maximum element in the stack.
popMax() -- Retrieve the maximum element in the stack, and remove it. If you find more than one maximum elements, only remove the top-most one.
Example 1:
MaxStack stack = new MaxStack();
stack.push(5);
stack.push(1);
stack.push(5);
stack.top(); -> 5
stack.popMax(); -> 5
stack.top(); -> 1
stack.peekMax(); -> 5
stack.pop(); -> 1
stack.top(); -> 5
Note:
-1e7 <= x <= 1e7
Number of operations won't exceed 10000.
The last four operations won't be called when stack is empty.
*/
public class _716 {
public static class Solution1 {
public static class MaxStack {
private int max;
private Stack<Integer> stack;
/**
* initialize your data structure here.
*/
public MaxStack() {
max = Integer.MIN_VALUE;
stack = new Stack<>();
}
public void push(int x) {
if (x > max) {
max = x;
}
stack.push(x);
}
public int pop() {
if (stack.peek() == max) {
int result = stack.pop();
max = findMax();
return result;
} else {
return stack.pop();
}
}
private int findMax() {
if (!stack.isEmpty()) {
Iterator<Integer> iterator = stack.iterator();
int max = stack.peek();
while (iterator.hasNext()) {
max = Math.max(max, iterator.next());
}
return max;
} else {
max = Integer.MIN_VALUE;
return max;
}
}
public int top() {
return stack.peek();
}
public int peekMax() {
return max;
}
public int popMax() {
Stack<Integer> tmp = new Stack<>();
int result = 0;
while (!stack.isEmpty()) {
if (stack.peek() != max) {
tmp.push(stack.pop());
} else {
result = stack.pop();
break;
}
}
while (!tmp.isEmpty()) {
stack.push(tmp.pop());
}
max = findMax();
return result;
}
}
}
}