设计前中后队列
难度:
标签:
题目描述
代码结果
运行时间: 76 ms, 内存: 15.6 MB
/*
题目思路:
1. 使用双向链表Deque来存储队列元素,利用Java Streams进行操作。
2. pushFront:使用Deque的addFirst方法将元素添加到头部。
3. pushMiddle:通过Streams计算中间位置并插入元素。
4. pushBack:使用Deque的addLast方法将元素添加到尾部。
5. popFront:移除头部元素并返回值,使用Deque的pollFirst方法。
6. popMiddle:通过Streams计算中间位置并移除元素。
7. popBack:移除尾部元素并返回值,使用Deque的pollLast方法。
*/
import java.util.Deque;
import java.util.LinkedList;
import java.util.stream.Collectors;
class FrontMiddleBackQueue {
private Deque<Integer> deque;
public FrontMiddleBackQueue() {
deque = new LinkedList<>();
}
public void pushFront(int val) {
deque.addFirst(val);
}
public void pushMiddle(int val) {
int midIndex = (deque.size() + 1) / 2;
LinkedList<Integer> tempList = deque.stream().collect(Collectors.toCollection(LinkedList::new));
tempList.add(midIndex, val);
deque = tempList;
}
public void pushBack(int val) {
deque.addLast(val);
}
public int popFront() {
return deque.isEmpty() ? -1 : deque.pollFirst();
}
public int popMiddle() {
if (deque.isEmpty()) return -1;
int midIndex = (deque.size() - 1) / 2;
LinkedList<Integer> tempList = deque.stream().collect(Collectors.toCollection(LinkedList::new));
int value = tempList.remove(midIndex);
deque = tempList;
return value;
}
public int popBack() {
return deque.isEmpty() ? -1 : deque.pollLast();
}
}
解释
方法:
此题解采用了两个双端队列(deque)来高效地支持队列的前中后操作。两个队列分别称为 front 和 back,其中 front 队列处理前半部分的元素,而 back 队列处理后半部分的元素。对于中间的操作,当 front 队列的长度比 back 队列长时,将会调整元素以保持平衡。此方法通过两个队列来协调元素,使得添加和删除操作都可以尽可能接近 O(1) 时间复杂度。
时间复杂度:
O(1)
空间复杂度:
O(n)
代码细节讲解
🦆
在使用两个双端队列的设计中,为何选择在两个队列长度不平衡时从一个队列的末尾移动元素到另一个队列的开头,而不是从开头到末尾?
▷🦆
如何处理在 pushMiddle 和 popMiddle 操作中,当队列具有偶数个元素时,中间位置的选择和元素的移动?
▷🦆
在 pushBack 操作中,当 back 队列长度超过 front 队列时,你是如何决定何时以及如何从 back 移动元素到 front 来保持平衡?
▷🦆
在 popFront 操作中,如果 front 队列为空而 back 队列不为空,为什么直接将 back 队列的元素移至 front,而不考虑 back 队列中元素的具体位置?
▷