设计自助结算系统
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 404 ms, 内存: 18.5 MB
/*
* 思路:
* 使用两个队列来实现自助结账系统。一个队列用于存储商品价格,另一个队列用于存储当前最高价格。
* 每次添加商品时,更新最高价格队列;每次移除商品时,同步更新最高价格队列。
* 通过Java Stream API来简化部分操作。
*/
import java.util.LinkedList;
import java.util.Queue;
import java.util.stream.Collectors;
public class Checkout {
private Queue<Integer> prices;
private Queue<Integer> maxPrices;
public Checkout() {
prices = new LinkedList<>();
maxPrices = new LinkedList<>();
}
public int get_max() {
if (maxPrices.isEmpty()) {
return -1;
}
return maxPrices.peek();
}
public void add(int value) {
prices.offer(value);
maxPrices = maxPrices.stream()
.filter(max -> max >= value)
.collect(Collectors.toCollection(LinkedList::new));
maxPrices.offer(value);
}
public int remove() {
if (prices.isEmpty()) {
return -1;
}
int removedValue = prices.poll();
if (removedValue == maxPrices.peek()) {
maxPrices.poll();
}
return removedValue;
}
}
解释
方法:
该题解通过使用两个数组(queue 和 max_stack)来实现一个自助结账系统。queue 用于正常队列操作,存储加入的商品价格。max_stack 用于维护当前队列中所有未被移除的商品的最大价格,确保 get_max() 能以 O(1) 的时间复杂度运行。在 add 操作中,会将小于新加入值的元素从 max_stack 中移除,以保持 max_stack 的第一个元素始终是当前队列中的最大值。remove 操作中,若移除的元素是当前最大值(即 max_stack 的首元素),则同时从 max_stack 中移除这个元素。
时间复杂度:
O(1) 均摊
空间复杂度:
O(n)
代码细节讲解
🦆
在add操作中,为什么要移除max_stack中所有小于新商品价格的元素?
▷🦆
如果在remove操作中移除的元素不是max_stack中的首元素,你是如何处理max_stack的?
▷🦆
对于边界条件,如何处理当所有商品价格都相同时,max_stack中的元素情况?
▷