Skip to content

Commit fa8187d

Browse files
committedMar 1, 2023
feat: add solutions to lc problem: No.0716
No.0716.Max Stack
1 parent c7a85cb commit fa8187d

File tree

5 files changed

+675
-0
lines changed

5 files changed

+675
-0
lines changed
 

‎solution/0700-0799/0716.Max Stack/README.md

+234
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,256 @@ stk.top(); // 返回 5,[<strong>5</strong>] - 栈没有改变
6565

6666
<!-- 这里可写通用的实现逻辑 -->
6767

68+
**方法一:双向链表 + 有序集合**
69+
70+
使用双向链表存储栈中的元素,使用有序集合存储栈中的元素,有序集合中的元素按照从小到大的顺序存储,每个元素都对应着双向链表中的一个节点。
71+
72+
- 调用 `push(x)` 方法时,将元素 `x` 插入到双向链表的末尾,同时将元素 `x` 对应的节点插入到有序集合中。时间复杂度 $O(\log n)$。
73+
- 调用 `pop()` 方法时,将双向链表的末尾节点删除,同时将有序集合中的对应节点删除。时间复杂度 $O(\log n)$。
74+
- 调用 `top()` 方法时,返回双向链表的末尾节点的值。时间复杂度 $O(1)$。
75+
- 调用 `peekMax()` 方法时,返回有序集合中的最后一个元素对应的节点的值。时间复杂度 $O(\log n)$。
76+
- 调用 `popMax()` 方法时,将有序集合中的最后一个元素删除,同时将对应的节点从双向链表中删除。时间复杂度 $O(\log n)$。
77+
78+
空间复杂度 $O(n)$。其中 $n$ 为栈中的元素个数。
79+
6880
<!-- tabs:start -->
6981

7082
### **Python3**
7183

7284
<!-- 这里可写当前语言的特殊实现逻辑 -->
7385

7486
```python
87+
from sortedcontainers import SortedList
88+
89+
90+
class Node:
91+
def __init__(self, val=0):
92+
self.val = val
93+
self.prev: Union[Node, None] = None
94+
self.next: Union[Node, None] = None
95+
96+
97+
class DoubleLinkedList:
98+
def __init__(self):
99+
self.head = Node()
100+
self.tail = Node()
101+
self.head.next = self.tail
102+
self.tail.prev = self.head
103+
104+
def append(self, val) -> Node:
105+
node = Node(val)
106+
node.next = self.tail
107+
node.prev = self.tail.prev
108+
self.tail.prev = node
109+
node.prev.next = node
110+
return node
111+
112+
@staticmethod
113+
def remove(node) -> Node:
114+
node.prev.next = node.next
115+
node.next.prev = node.prev
116+
return node
117+
118+
def pop(self) -> Node:
119+
return self.remove(self.tail.prev)
120+
121+
def peek(self):
122+
return self.tail.prev.val
75123

124+
125+
class MaxStack:
126+
127+
def __init__(self):
128+
self.stk = DoubleLinkedList()
129+
self.sl = SortedList(key=lambda x: x.val)
130+
131+
def push(self, x: int) -> None:
132+
node = self.stk.append(x)
133+
self.sl.add(node)
134+
135+
def pop(self) -> int:
136+
node = self.stk.pop()
137+
self.sl.remove(node)
138+
return node.val
139+
140+
def top(self) -> int:
141+
return self.stk.peek()
142+
143+
def peekMax(self) -> int:
144+
return self.sl[-1].val
145+
146+
def popMax(self) -> int:
147+
node = self.sl.pop()
148+
DoubleLinkedList.remove(node)
149+
return node.val
150+
151+
# Your MaxStack object will be instantiated and called as such:
152+
# obj = MaxStack()
153+
# obj.push(x)
154+
# param_2 = obj.pop()
155+
# param_3 = obj.top()
156+
# param_4 = obj.peekMax()
157+
# param_5 = obj.popMax()
76158
```
77159

78160
### **Java**
79161

80162
<!-- 这里可写当前语言的特殊实现逻辑 -->
81163

82164
```java
165+
class Node {
166+
public int val;
167+
public Node prev, next;
168+
169+
public Node() {
170+
171+
}
172+
173+
public Node(int val) {
174+
this.val = val;
175+
}
176+
}
177+
178+
class DoubleLinkedList {
179+
private final Node head = new Node();
180+
private final Node tail = new Node();
181+
182+
public DoubleLinkedList() {
183+
head.next = tail;
184+
tail.prev = head;
185+
}
186+
187+
public Node append(int val) {
188+
Node node = new Node(val);
189+
node.next = tail;
190+
node.prev = tail.prev;
191+
tail.prev = node;
192+
node.prev.next = node;
193+
return node;
194+
}
195+
196+
public static Node remove(Node node) {
197+
node.prev.next = node.next;
198+
node.next.prev = node.prev;
199+
return node;
200+
}
201+
202+
public Node pop() {
203+
return remove(tail.prev);
204+
}
205+
206+
public int peek() {
207+
return tail.prev.val;
208+
}
209+
}
210+
211+
class MaxStack {
212+
private DoubleLinkedList stk = new DoubleLinkedList();
213+
private TreeMap<Integer, List<Node>> tm = new TreeMap<>();
214+
215+
public MaxStack() {
216+
217+
}
218+
219+
public void push(int x) {
220+
Node node = stk.append(x);
221+
tm.computeIfAbsent(x, k -> new ArrayList<>()).add(node);
222+
}
223+
224+
public int pop() {
225+
Node node = stk.pop();
226+
List<Node> nodes = tm.get(node.val);
227+
int x = nodes.remove(nodes.size() - 1).val;
228+
if (nodes.isEmpty()) {
229+
tm.remove(node.val);
230+
}
231+
return x;
232+
}
233+
234+
public int top() {
235+
return stk.peek();
236+
}
237+
238+
public int peekMax() {
239+
return tm.lastKey();
240+
}
241+
242+
public int popMax() {
243+
int x = peekMax();
244+
List<Node> nodes = tm.get(x);
245+
Node node = nodes.remove(nodes.size() - 1);
246+
if (nodes.isEmpty()) {
247+
tm.remove(x);
248+
}
249+
DoubleLinkedList.remove(node);
250+
return x;
251+
}
252+
}
253+
254+
/**
255+
* Your MaxStack object will be instantiated and called as such:
256+
* MaxStack obj = new MaxStack();
257+
* obj.push(x);
258+
* int param_2 = obj.pop();
259+
* int param_3 = obj.top();
260+
* int param_4 = obj.peekMax();
261+
* int param_5 = obj.popMax();
262+
*/
263+
```
264+
265+
### **C++**
266+
267+
```cpp
268+
class MaxStack {
269+
public:
270+
MaxStack() {
271+
}
272+
273+
void push(int x) {
274+
stk.push_back(x);
275+
tm.insert({x, --stk.end()});
276+
}
277+
278+
int pop() {
279+
auto it = --stk.end();
280+
int ans = *it;
281+
auto mit = --tm.upper_bound(ans);
282+
tm.erase(mit);
283+
stk.erase(it);
284+
return ans;
285+
}
286+
287+
int top() {
288+
return stk.back();
289+
}
290+
291+
int peekMax() {
292+
return tm.rbegin()->first;
293+
}
294+
295+
int popMax() {
296+
auto mit = --tm.end();
297+
auto it = mit->second;
298+
int ans = *it;
299+
tm.erase(mit);
300+
stk.erase(it);
301+
return ans;
302+
}
303+
304+
private:
305+
multimap<int, list<int>::iterator> tm;
306+
list<int> stk;
307+
};
83308

309+
/**
310+
* Your MaxStack object will be instantiated and called as such:
311+
* MaxStack* obj = new MaxStack();
312+
* obj->push(x);
313+
* int param_2 = obj->pop();
314+
* int param_3 = obj->top();
315+
* int param_4 = obj->peekMax();
316+
* int param_5 = obj->popMax();
317+
*/
84318
```
85319

86320
### **...**

‎solution/0700-0799/0716.Max Stack/README_EN.md

+222
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,235 @@ stk.top(); // return 5, [<strong><u>5</u></strong>] the stack did not change
5858
### **Python3**
5959

6060
```python
61+
from sortedcontainers import SortedList
6162

63+
64+
class Node:
65+
def __init__(self, val=0):
66+
self.val = val
67+
self.prev: Union[Node, None] = None
68+
self.next: Union[Node, None] = None
69+
70+
71+
class DoubleLinkedList:
72+
def __init__(self):
73+
self.head = Node()
74+
self.tail = Node()
75+
self.head.next = self.tail
76+
self.tail.prev = self.head
77+
78+
def append(self, val) -> Node:
79+
node = Node(val)
80+
node.next = self.tail
81+
node.prev = self.tail.prev
82+
self.tail.prev = node
83+
node.prev.next = node
84+
return node
85+
86+
@staticmethod
87+
def remove(node) -> Node:
88+
node.prev.next = node.next
89+
node.next.prev = node.prev
90+
return node
91+
92+
def pop(self) -> Node:
93+
return self.remove(self.tail.prev)
94+
95+
def peek(self):
96+
return self.tail.prev.val
97+
98+
99+
class MaxStack:
100+
101+
def __init__(self):
102+
self.stk = DoubleLinkedList()
103+
self.sl = SortedList(key=lambda x: x.val)
104+
105+
def push(self, x: int) -> None:
106+
node = self.stk.append(x)
107+
self.sl.add(node)
108+
109+
def pop(self) -> int:
110+
node = self.stk.pop()
111+
self.sl.remove(node)
112+
return node.val
113+
114+
def top(self) -> int:
115+
return self.stk.peek()
116+
117+
def peekMax(self) -> int:
118+
return self.sl[-1].val
119+
120+
def popMax(self) -> int:
121+
node = self.sl.pop()
122+
DoubleLinkedList.remove(node)
123+
return node.val
124+
125+
# Your MaxStack object will be instantiated and called as such:
126+
# obj = MaxStack()
127+
# obj.push(x)
128+
# param_2 = obj.pop()
129+
# param_3 = obj.top()
130+
# param_4 = obj.peekMax()
131+
# param_5 = obj.popMax()
62132
```
63133

64134
### **Java**
65135

66136
```java
137+
class Node {
138+
public int val;
139+
public Node prev, next;
140+
141+
public Node() {
142+
143+
}
144+
145+
public Node(int val) {
146+
this.val = val;
147+
}
148+
}
149+
150+
class DoubleLinkedList {
151+
private final Node head = new Node();
152+
private final Node tail = new Node();
153+
154+
public DoubleLinkedList() {
155+
head.next = tail;
156+
tail.prev = head;
157+
}
158+
159+
public Node append(int val) {
160+
Node node = new Node(val);
161+
node.next = tail;
162+
node.prev = tail.prev;
163+
tail.prev = node;
164+
node.prev.next = node;
165+
return node;
166+
}
167+
168+
public static Node remove(Node node) {
169+
node.prev.next = node.next;
170+
node.next.prev = node.prev;
171+
return node;
172+
}
173+
174+
public Node pop() {
175+
return remove(tail.prev);
176+
}
177+
178+
public int peek() {
179+
return tail.prev.val;
180+
}
181+
}
182+
183+
class MaxStack {
184+
private DoubleLinkedList stk = new DoubleLinkedList();
185+
private TreeMap<Integer, List<Node>> tm = new TreeMap<>();
186+
187+
public MaxStack() {
188+
189+
}
190+
191+
public void push(int x) {
192+
Node node = stk.append(x);
193+
tm.computeIfAbsent(x, k -> new ArrayList<>()).add(node);
194+
}
195+
196+
public int pop() {
197+
Node node = stk.pop();
198+
List<Node> nodes = tm.get(node.val);
199+
int x = nodes.remove(nodes.size() - 1).val;
200+
if (nodes.isEmpty()) {
201+
tm.remove(node.val);
202+
}
203+
return x;
204+
}
205+
206+
public int top() {
207+
return stk.peek();
208+
}
209+
210+
public int peekMax() {
211+
return tm.lastKey();
212+
}
213+
214+
public int popMax() {
215+
int x = peekMax();
216+
List<Node> nodes = tm.get(x);
217+
Node node = nodes.remove(nodes.size() - 1);
218+
if (nodes.isEmpty()) {
219+
tm.remove(x);
220+
}
221+
DoubleLinkedList.remove(node);
222+
return x;
223+
}
224+
}
225+
226+
/**
227+
* Your MaxStack object will be instantiated and called as such:
228+
* MaxStack obj = new MaxStack();
229+
* obj.push(x);
230+
* int param_2 = obj.pop();
231+
* int param_3 = obj.top();
232+
* int param_4 = obj.peekMax();
233+
* int param_5 = obj.popMax();
234+
*/
235+
```
236+
237+
### **C++**
238+
239+
```cpp
240+
class MaxStack {
241+
public:
242+
MaxStack() {
243+
}
244+
245+
void push(int x) {
246+
stk.push_back(x);
247+
tm.insert({x, --stk.end()});
248+
}
249+
250+
int pop() {
251+
auto it = --stk.end();
252+
int ans = *it;
253+
auto mit = --tm.upper_bound(ans);
254+
tm.erase(mit);
255+
stk.erase(it);
256+
return ans;
257+
}
258+
259+
int top() {
260+
return stk.back();
261+
}
262+
263+
int peekMax() {
264+
return tm.rbegin()->first;
265+
}
266+
267+
int popMax() {
268+
auto mit = --tm.end();
269+
auto it = mit->second;
270+
int ans = *it;
271+
tm.erase(mit);
272+
stk.erase(it);
273+
return ans;
274+
}
275+
276+
private:
277+
multimap<int, list<int>::iterator> tm;
278+
list<int> stk;
279+
};
67280

281+
/**
282+
* Your MaxStack object will be instantiated and called as such:
283+
* MaxStack* obj = new MaxStack();
284+
* obj->push(x);
285+
* int param_2 = obj->pop();
286+
* int param_3 = obj->top();
287+
* int param_4 = obj->peekMax();
288+
* int param_5 = obj->popMax();
289+
*/
68290
```
69291

70292
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
class MaxStack {
2+
public:
3+
MaxStack() {
4+
}
5+
6+
void push(int x) {
7+
stk.push_back(x);
8+
tm.insert({x, --stk.end()});
9+
}
10+
11+
int pop() {
12+
auto it = --stk.end();
13+
int ans = *it;
14+
auto mit = --tm.upper_bound(ans);
15+
tm.erase(mit);
16+
stk.erase(it);
17+
return ans;
18+
}
19+
20+
int top() {
21+
return stk.back();
22+
}
23+
24+
int peekMax() {
25+
return tm.rbegin()->first;
26+
}
27+
28+
int popMax() {
29+
auto mit = --tm.end();
30+
auto it = mit->second;
31+
int ans = *it;
32+
tm.erase(mit);
33+
stk.erase(it);
34+
return ans;
35+
}
36+
37+
private:
38+
multimap<int, list<int>::iterator> tm;
39+
list<int> stk;
40+
};
41+
42+
/**
43+
* Your MaxStack object will be instantiated and called as such:
44+
* MaxStack* obj = new MaxStack();
45+
* obj->push(x);
46+
* int param_2 = obj->pop();
47+
* int param_3 = obj->top();
48+
* int param_4 = obj->peekMax();
49+
* int param_5 = obj->popMax();
50+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
class Node {
2+
public int val;
3+
public Node prev, next;
4+
5+
public Node() {
6+
7+
}
8+
9+
public Node(int val) {
10+
this.val = val;
11+
}
12+
}
13+
14+
class DoubleLinkedList {
15+
private final Node head = new Node();
16+
private final Node tail = new Node();
17+
18+
public DoubleLinkedList() {
19+
head.next = tail;
20+
tail.prev = head;
21+
}
22+
23+
public Node append(int val) {
24+
Node node = new Node(val);
25+
node.next = tail;
26+
node.prev = tail.prev;
27+
tail.prev = node;
28+
node.prev.next = node;
29+
return node;
30+
}
31+
32+
public static Node remove(Node node) {
33+
node.prev.next = node.next;
34+
node.next.prev = node.prev;
35+
return node;
36+
}
37+
38+
public Node pop() {
39+
return remove(tail.prev);
40+
}
41+
42+
public int peek() {
43+
return tail.prev.val;
44+
}
45+
}
46+
47+
class MaxStack {
48+
private DoubleLinkedList stk = new DoubleLinkedList();
49+
private TreeMap<Integer, List<Node>> tm = new TreeMap<>();
50+
51+
public MaxStack() {
52+
53+
}
54+
55+
public void push(int x) {
56+
Node node = stk.append(x);
57+
tm.computeIfAbsent(x, k -> new ArrayList<>()).add(node);
58+
}
59+
60+
public int pop() {
61+
Node node = stk.pop();
62+
List<Node> nodes = tm.get(node.val);
63+
int x = nodes.remove(nodes.size() - 1).val;
64+
if (nodes.isEmpty()) {
65+
tm.remove(node.val);
66+
}
67+
return x;
68+
}
69+
70+
public int top() {
71+
return stk.peek();
72+
}
73+
74+
public int peekMax() {
75+
return tm.lastKey();
76+
}
77+
78+
public int popMax() {
79+
int x = peekMax();
80+
List<Node> nodes = tm.get(x);
81+
Node node = nodes.remove(nodes.size() - 1);
82+
if (nodes.isEmpty()) {
83+
tm.remove(x);
84+
}
85+
DoubleLinkedList.remove(node);
86+
return x;
87+
}
88+
}
89+
90+
/**
91+
* Your MaxStack object will be instantiated and called as such:
92+
* MaxStack obj = new MaxStack();
93+
* obj.push(x);
94+
* int param_2 = obj.pop();
95+
* int param_3 = obj.top();
96+
* int param_4 = obj.peekMax();
97+
* int param_5 = obj.popMax();
98+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from sortedcontainers import SortedList
2+
3+
4+
class Node:
5+
def __init__(self, val=0):
6+
self.val = val
7+
self.prev: Union[Node, None] = None
8+
self.next: Union[Node, None] = None
9+
10+
11+
class DoubleLinkedList:
12+
def __init__(self):
13+
self.head = Node()
14+
self.tail = Node()
15+
self.head.next = self.tail
16+
self.tail.prev = self.head
17+
18+
def append(self, val) -> Node:
19+
node = Node(val)
20+
node.next = self.tail
21+
node.prev = self.tail.prev
22+
self.tail.prev = node
23+
node.prev.next = node
24+
return node
25+
26+
@staticmethod
27+
def remove(node) -> Node:
28+
node.prev.next = node.next
29+
node.next.prev = node.prev
30+
return node
31+
32+
def pop(self) -> Node:
33+
return self.remove(self.tail.prev)
34+
35+
def peek(self):
36+
return self.tail.prev.val
37+
38+
39+
class MaxStack:
40+
41+
def __init__(self):
42+
self.stk = DoubleLinkedList()
43+
self.sl = SortedList(key=lambda x: x.val)
44+
45+
def push(self, x: int) -> None:
46+
node = self.stk.append(x)
47+
self.sl.add(node)
48+
49+
def pop(self) -> int:
50+
node = self.stk.pop()
51+
self.sl.remove(node)
52+
return node.val
53+
54+
def top(self) -> int:
55+
return self.stk.peek()
56+
57+
def peekMax(self) -> int:
58+
return self.sl[-1].val
59+
60+
def popMax(self) -> int:
61+
node = self.sl.pop()
62+
DoubleLinkedList.remove(node)
63+
return node.val
64+
65+
# Your MaxStack object will be instantiated and called as such:
66+
# obj = MaxStack()
67+
# obj.push(x)
68+
# param_2 = obj.pop()
69+
# param_3 = obj.top()
70+
# param_4 = obj.peekMax()
71+
# param_5 = obj.popMax()

0 commit comments

Comments
 (0)
Please sign in to comment.