leetcode
leetcode 2601 ~ 2650
设计自助结算系统

设计自助结算系统

难度:

标签:

题目描述

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中所有小于新商品价格的元素?
在`add`操作中,移除`max_stack`中所有小于新商品价格的元素是为了维护`max_stack`的性质,即`max_stack`的第一个元素总是当前队列中的最大值。这样做确保了`get_max()`操作可以在常数时间内完成。当一个新的更大的元素被添加到队列中时,所有比它小的元素不会再是最大元素,因此从`max_stack`中移除这些元素可以保持栈的有效性和更新队列的最大值。
🦆
如果在remove操作中移除的元素不是max_stack中的首元素,你是如何处理max_stack的?
在`remove`操作中,如果移除的元素不是`max_stack`中的首元素,这意味着移除的元素小于当前队列的最大值。在这种情况下,`max_stack`不需要更新,因为移除的元素并不影响队列中的最大值。`max_stack`的首元素仍然是队列中的最大值,因此保持不变。
🦆
对于边界条件,如何处理当所有商品价格都相同时,max_stack中的元素情况?
当所有商品价格相同时,每次`add`操作添加的元素都与`max_stack`中的元素相等。在这种情况下,每个元素都需要被添加到`max_stack`中,因为每个元素都可能成为队列中的最大值。因此,`max_stack`将包含与队列长度相同数量的元素,每个都是相同的最大值。在`remove`操作中,每次移除队列和`max_stack`的首元素。

相关问题