0
点赞
收藏
分享

微信扫一扫

LeetCode(剑指 Offer)- 59 - II. 队列的最大值


题目链接:​​点击打开链接​​

题目大意:略。

解题思路:插入操作虽然看起来有循环,做一个插入操作时最多可能会有 n 次出队操作。但要注意,由于每个数字只会出队一次,因此对于所有的 n 个数字的插入过程,对应的所有出队操作也不会大于 n 次。因此将出队的时间均摊到每个插入操作上,时间复杂度为 O(1)【注意题目说的是“均摊”,而不是最差情况】。

相关企业

  • 字节跳动

AC 代码

  • Java
// 解决方案(1)
class MaxQueue {
Queue<Integer> queue;
Deque<Integer> deque;
public MaxQueue() {
queue = new LinkedList<>();
deque = new LinkedList<>();
}
public int max_value() {
return deque.isEmpty() ? -1 : deque.peekFirst();
}
public void push_back(int value) {
queue.offer(value);
while(!deque.isEmpty() && deque.peekLast() < value)
deque.pollLast();
deque.offerLast(value);
}
public int pop_front() {
if(queue.isEmpty()) return -1;
if(queue.peek().equals(deque.peekFirst()))
deque.pollFirst();
return queue.poll();
}
}

// 解决方案(2)
class MaxQueue {

int[] data = new int[10000];

int[] order = new int[10000];

int dHead = -1;

int dTail = -1;

int oHead = 0;

int oTail = -1;

public MaxQueue() {

}

public int max_value() {
return order[oHead] == 0 ? -1 : order[oHead];
}

public void push_back(int value) {
data[++dTail] = value;
while (-1 != oTail && order[oTail] != 0 && order[oTail] < value) {
order[oTail--] = 0;
}
order[++oTail] = value;
}

public int pop_front() {
if (dTail == dHead) {
return -1;
}
int res = data[++dHead];
if (res == order[oHead]) {
order[oHead++] = 0;
}
data[dHead] = 0;
return res;
}
}
  • C++
class MaxQueue {
queue<int> que;
deque<int> deq;
public:
MaxQueue() { }
int max_value() {
return deq.empty() ? -1 : deq.front();
}
void push_back(int value) {
que.push(value);
while(!deq.empty() && deq.back() < value)
deq.pop_back();
deq.push_back(value);
}
int pop_front() {
if(que.empty()) return -1;
int val = que.front();
if(val == deq.front())
deq.pop_front();
que.pop();
return val;
}
};


举报

相关推荐

0 条评论