力扣,https://leetcode.cn/problems/dui-lie-de-zui-da-zhi-lcof/description/
与滑动窗口最大值思路一致!!!
Python
class Checkout:
def __init__(self):
self.q1 = collections.deque()
self.q2 = collections.deque()
def get_max(self) -> int:
if len(self.q2) == 0:
return -1
return self.q2[0]
def add(self, value: int) -> None:
self.q1.append(value)
while len(self.q2) > 0 and self.q2[-1] < value:
self.q2.pop()
self.q2.append(value)
def remove(self) -> int:
if len(self.q1) == 0:
return -1
val = self.q1.popleft()
if val == self.q2[0]:
self.q2.popleft()
return val
# Your Checkout object will be instantiated and called as such:
# obj = Checkout()
# param_1 = obj.get_max()
# obj.add(value)
# param_3 = obj.remove()
Java
class Checkout {
Deque<Integer> deque1;
Deque<Integer> deque2; // 降序
public Checkout() {
deque1 = new LinkedList<>();
deque2 = new LinkedList<>();
}
public int get_max() {
if (deque2.isEmpty()) {
return -1;
}
return deque2.peekFirst();
}
public void add(int value) {
deque1.offerLast(value);
while (!deque2.isEmpty() && deque2.peekLast() < value) {
deque2.pollLast();
}
deque2.offerLast(value);
}
public int remove() {
if (deque1.isEmpty()) {
return -1;
}
int val = deque1.pollFirst();
if (!deque2.isEmpty() && deque2.peekFirst() == val) {
deque2.pollFirst();
}
return val;
}
}