Skip to content

Commit d4ea666

Browse files
committed
feat: add solutions to lc problem: No.1670. Design Front Middle Back Queue
1 parent 1729b87 commit d4ea666

File tree

4 files changed

+416
-6
lines changed

4 files changed

+416
-6
lines changed

solution/1600-1699/1670.Design Front Middle Back Queue/README.md

+140-3
Original file line numberDiff line numberDiff line change
@@ -60,27 +60,164 @@ q.popFront(); // 返回 -1 -> [] (队列为空)
6060
<li>最多调用 <code>1000</code> 次 <code>pushFront</code>, <code>pushMiddle</code>, <code>pushBack</code>, <code>popFront</code>, <code>popMiddle</code> 和 <code>popBack</code> 。</li>
6161
</ul>
6262

63-
6463
## 解法
6564

6665
<!-- 这里可写通用的实现逻辑 -->
6766

67+
两个“双端队列”实现。
68+
6869
<!-- tabs:start -->
6970

7071
### **Python3**
7172

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

7475
```python
75-
76+
class FrontMiddleBackQueue:
77+
78+
def __init__(self):
79+
self.left = collections.deque()
80+
self.right = collections.deque()
81+
82+
def pushFront(self, val: int) -> None:
83+
self.left.appendleft(val)
84+
self.rebalance()
85+
86+
def pushMiddle(self, val: int) -> None:
87+
self.left.append(val)
88+
self.rebalance()
89+
90+
def pushBack(self, val: int) -> None:
91+
self.right.append(val)
92+
self.rebalance()
93+
94+
def popFront(self) -> int:
95+
if self.empty():
96+
return -1
97+
if self.left:
98+
val = self.left.popleft()
99+
else:
100+
val = self.right.popleft()
101+
self.rebalance()
102+
return val
103+
104+
def popMiddle(self) -> int:
105+
if self.empty():
106+
return -1
107+
if len(self.left) >= len(self.right):
108+
val = self.left.pop()
109+
else:
110+
val = self.right.popleft()
111+
self.rebalance()
112+
return val
113+
114+
def popBack(self) -> int:
115+
if self.empty():
116+
return -1
117+
val = self.right.pop()
118+
self.rebalance()
119+
return val
120+
121+
def empty(self) -> bool:
122+
return not self.left and not self.right
123+
124+
def rebalance(self) -> None:
125+
while len(self.left) > len(self.right):
126+
self.right.appendleft(self.left.pop())
127+
while len(self.right) - len(self.left) > 1:
128+
self.left.append(self.right.popleft())
129+
130+
131+
# Your FrontMiddleBackQueue object will be instantiated and called as such:
132+
# obj = FrontMiddleBackQueue()
133+
# obj.pushFront(val)
134+
# obj.pushMiddle(val)
135+
# obj.pushBack(val)
136+
# param_4 = obj.popFront()
137+
# param_5 = obj.popMiddle()
138+
# param_6 = obj.popBack()
76139
```
77140

78141
### **Java**
79142

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

82145
```java
83-
146+
class FrontMiddleBackQueue {
147+
private Deque<Integer> left;
148+
private Deque<Integer> right;
149+
150+
public FrontMiddleBackQueue() {
151+
left = new LinkedList<>();
152+
right = new LinkedList<>();
153+
}
154+
155+
public void pushFront(int val) {
156+
left.offerFirst(val);
157+
rebalance();
158+
}
159+
160+
public void pushMiddle(int val) {
161+
left.offerLast(val);
162+
rebalance();
163+
}
164+
165+
public void pushBack(int val) {
166+
right.offerLast(val);
167+
rebalance();
168+
}
169+
170+
public int popFront() {
171+
if (empty()) {
172+
return -1;
173+
}
174+
int val = left.isEmpty() ? right.pollFirst() : left.pollFirst();
175+
rebalance();
176+
return val;
177+
}
178+
179+
public int popMiddle() {
180+
if (empty()) {
181+
return -1;
182+
}
183+
int val = left.size() >= right.size() ? left.pollLast() : right.pollFirst();
184+
rebalance();
185+
return val;
186+
}
187+
188+
public int popBack() {
189+
if (empty()) {
190+
return -1;
191+
}
192+
int val = right.pollLast();
193+
rebalance();
194+
return val;
195+
}
196+
197+
private boolean empty() {
198+
return left.isEmpty() && right.isEmpty();
199+
}
200+
201+
private void rebalance() {
202+
while (left.size() > right.size()) {
203+
right.offerFirst(left.pollLast());
204+
}
205+
while (right.size() - left.size() > 1) {
206+
left.offerLast(right.pollFirst());
207+
}
208+
}
209+
}
210+
211+
/**
212+
* Your FrontMiddleBackQueue object will be instantiated and called as such:
213+
* FrontMiddleBackQueue obj = new FrontMiddleBackQueue();
214+
* obj.pushFront(val);
215+
* obj.pushMiddle(val);
216+
* obj.pushBack(val);
217+
* int param_4 = obj.popFront();
218+
* int param_5 = obj.popMiddle();
219+
* int param_6 = obj.popBack();
220+
*/
84221
```
85222

86223
### **...**

solution/1600-1699/1670.Design Front Middle Back Queue/README_EN.md

+138-3
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,156 @@ q.popFront(); // return -1 -&gt; [] (The queue is empty)
5656
<li>At most&nbsp;<code>1000</code>&nbsp;calls will be made to&nbsp;<code>pushFront</code>,&nbsp;<code>pushMiddle</code>,&nbsp;<code>pushBack</code>, <code>popFront</code>, <code>popMiddle</code>, and <code>popBack</code>.</li>
5757
</ul>
5858

59-
6059
## Solutions
6160

6261
<!-- tabs:start -->
6362

6463
### **Python3**
6564

6665
```python
67-
66+
class FrontMiddleBackQueue:
67+
68+
def __init__(self):
69+
self.left = collections.deque()
70+
self.right = collections.deque()
71+
72+
def pushFront(self, val: int) -> None:
73+
self.left.appendleft(val)
74+
self.rebalance()
75+
76+
def pushMiddle(self, val: int) -> None:
77+
self.left.append(val)
78+
self.rebalance()
79+
80+
def pushBack(self, val: int) -> None:
81+
self.right.append(val)
82+
self.rebalance()
83+
84+
def popFront(self) -> int:
85+
if self.empty():
86+
return -1
87+
if self.left:
88+
val = self.left.popleft()
89+
else:
90+
val = self.right.popleft()
91+
self.rebalance()
92+
return val
93+
94+
def popMiddle(self) -> int:
95+
if self.empty():
96+
return -1
97+
if len(self.left) >= len(self.right):
98+
val = self.left.pop()
99+
else:
100+
val = self.right.popleft()
101+
self.rebalance()
102+
return val
103+
104+
def popBack(self) -> int:
105+
if self.empty():
106+
return -1
107+
val = self.right.pop()
108+
self.rebalance()
109+
return val
110+
111+
def empty(self) -> bool:
112+
return not self.left and not self.right
113+
114+
def rebalance(self) -> None:
115+
while len(self.left) > len(self.right):
116+
self.right.appendleft(self.left.pop())
117+
while len(self.right) - len(self.left) > 1:
118+
self.left.append(self.right.popleft())
119+
120+
121+
# Your FrontMiddleBackQueue object will be instantiated and called as such:
122+
# obj = FrontMiddleBackQueue()
123+
# obj.pushFront(val)
124+
# obj.pushMiddle(val)
125+
# obj.pushBack(val)
126+
# param_4 = obj.popFront()
127+
# param_5 = obj.popMiddle()
128+
# param_6 = obj.popBack()
68129
```
69130

70131
### **Java**
71132

72133
```java
73-
134+
class FrontMiddleBackQueue {
135+
private Deque<Integer> left;
136+
private Deque<Integer> right;
137+
138+
public FrontMiddleBackQueue() {
139+
left = new LinkedList<>();
140+
right = new LinkedList<>();
141+
}
142+
143+
public void pushFront(int val) {
144+
left.offerFirst(val);
145+
rebalance();
146+
}
147+
148+
public void pushMiddle(int val) {
149+
left.offerLast(val);
150+
rebalance();
151+
}
152+
153+
public void pushBack(int val) {
154+
right.offerLast(val);
155+
rebalance();
156+
}
157+
158+
public int popFront() {
159+
if (empty()) {
160+
return -1;
161+
}
162+
int val = left.isEmpty() ? right.pollFirst() : left.pollFirst();
163+
rebalance();
164+
return val;
165+
}
166+
167+
public int popMiddle() {
168+
if (empty()) {
169+
return -1;
170+
}
171+
int val = left.size() >= right.size() ? left.pollLast() : right.pollFirst();
172+
rebalance();
173+
return val;
174+
}
175+
176+
public int popBack() {
177+
if (empty()) {
178+
return -1;
179+
}
180+
int val = right.pollLast();
181+
rebalance();
182+
return val;
183+
}
184+
185+
private boolean empty() {
186+
return left.isEmpty() && right.isEmpty();
187+
}
188+
189+
private void rebalance() {
190+
while (left.size() > right.size()) {
191+
right.offerFirst(left.pollLast());
192+
}
193+
while (right.size() - left.size() > 1) {
194+
left.offerLast(right.pollFirst());
195+
}
196+
}
197+
}
198+
199+
/**
200+
* Your FrontMiddleBackQueue object will be instantiated and called as such:
201+
* FrontMiddleBackQueue obj = new FrontMiddleBackQueue();
202+
* obj.pushFront(val);
203+
* obj.pushMiddle(val);
204+
* obj.pushBack(val);
205+
* int param_4 = obj.popFront();
206+
* int param_5 = obj.popMiddle();
207+
* int param_6 = obj.popBack();
208+
*/
74209
```
75210

76211
### **...**

0 commit comments

Comments
 (0)