この質問のアイデアは、前の質問、私のアイデアと似ています:
1プッシュすると、値が最大値より大きくなり、最大値キューがクリアされてから、この値が最大キューの最後に追加され、値が最大値より小さくなります。キュー、この値よりも小さい値のデータが削除され、次にこの値が最大キューの最後に追加されます。
2 popの場合、値は最大値と等しくなり、最大値キューの最大値が削除されます。
このアイデアは、主にキューの特性、キューとウィンドウの違いに言及しています。
ウィンドウのポップとプッシュは同時に発生し、毎回2つの操作が発生するため、ウィンドウの長さは変わりません。キューのポップとプッシュは別々に発生します。
コード:
実装には、なじみのないQueueとDequeの操作が含まれます。答えのコードは非常に簡潔です。
Deque<Integer> deque = new LinkedList();
Queue<Integer> queue = new LinkedList();
deque.size()
res = deque.peekLast();
deque.removeLast();
deque.addLast(value);
deque.peekFirst()
deque.removeFirst();
deque.addFirst(value);
私のコード
class MaxQueue {
Deque<Integer> deque = new LinkedList();
Queue<Integer> queue = new LinkedList();
public MaxQueue() {
}
public int max_value() {
int res = -1;
if(deque.size() > 0){
res = deque.peekLast();
}
return res;
}
public void push_back(int value) {
if(queue.size() >0){
queue.add(value);
if(value > deque.peekLast()){
while(deque.size()!=0){
deque.removeLast();
}
deque.addLast(value);
}else{
while(deque.size()!=0){
if(value > deque.peekFirst()){
deque.removeFirst();
}else{
break;
}
}
deque.addFirst(value);
}
}else{
queue.add(value);
deque.addLast(value);
}
}
public int pop_front() {
int quepop = -1;
if(queue.size() >0){
quepop = queue.remove();
if(quepop == deque.peekLast()){
while(deque.size()!=0){
if(deque.peekLast()==quepop){
deque.removeLast();
}else{
break;
}
}
}else{
}
}else{
return -1;
}
return quepop;
}
}
回答コード
class MaxQueue {
Queue<Integer> q;
Deque<Integer> d;
public MaxQueue() {
q = new LinkedList<Integer>();
d = new LinkedList<Integer>();
}
public int max_value() {
if (d.isEmpty()) {
return -1;
}
return d.peekFirst();
}
public void push_back(int value) {
while (!d.isEmpty() && d.peekLast() < value) {
d.pollLast();
}
d.offerLast(value);
q.offer(value);
}
public int pop_front() {
if (q.isEmpty()) {
return -1;
}
int ans = q.poll();
if (ans == d.peekFirst()) {
d.pollFirst();
}
return ans;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。