返回

商品折扣后的最终价格:揭秘单调栈的奥秘

后端

  1. 问题陈述

给你一个数组 prices,其中 prices[i] 是商店里第 i 件商品的价格。商店里有一个特殊的折扣为,如果第 i 件商品的价格 prices[i] 是 prices[i+1] 的折扣价,那么第 i 件商品的价格将只需花费 prices[i+1] 即可。

返回最终需要支付的总价。

注意,以上折扣仅适用于价格严格小于前一个商品价格的商品。

2. 解决思路

为了解决这个问题,我们可以使用单调栈算法。单调栈是一种数据结构,它允许我们在 O(n) 时间内找到一个数组中的最大值或最小值。在我们的情况下,我们将使用单调栈来跟踪价格数组中递增的商品价格。

3. 单调栈算法实现

我们首先创建一个单调栈。然后,我们从左到右遍历价格数组。对于每个商品,我们将价格压入单调栈。如果当前价格大于栈顶元素,则表明当前商品的价格不是折扣价,我们将当前价格压入单调栈。如果当前价格小于或等于栈顶元素,则表明当前商品的价格是折扣价,我们将栈顶元素出栈,并将当前价格减去出栈元素后压入单调栈。

我们重复上述步骤,直到遍历完整个价格数组。遍历结束后,单调栈中剩下的元素就是最终需要支付的价格。

4. 代码示例

def final_price(prices):
    """
    :type prices: List[int]
    :rtype: int
    """
    stack = []
    total_price = 0

    for price in prices:
        # 如果栈为空或者当前价格大于等于栈顶元素,直接压入栈
        if not stack or price >= stack[-1]:
            stack.append(price)
        # 如果当前价格小于栈顶元素,则出栈栈顶元素,并计算折扣价
        else:
            while stack and price < stack[-1]:
                total_price += stack.pop()
            stack.append(price)

    # 计算栈中剩余元素的总价
    while stack:
        total_price += stack.pop()

    return total_price


# 测试用例
prices = [8, 4, 6, 2, 3]
print(final_price(prices))  # 输出:14

5. 复杂度分析

  • 时间复杂度:O(n),其中 n 是价格数组的长度。
  • 空间复杂度:O(n),因为单调栈最多存储 n 个元素。

6. 总结

单调栈算法是一种简单且有效的算法,可以用于解决各种问题,例如寻找数组中的最大值或最小值、寻找数组中递增或递减的子数组等。在本文中,我们使用单调栈算法解决了 LeetCode 上一道有趣且具有挑战性的题目:“1475. 商品折扣后的最终价格”。希望您对单调栈算法有了更深入的了解!