返回
商品折扣后的最终价格:揭秘单调栈的奥秘
后端
2024-02-17 18:42:36
- 问题陈述
给你一个数组 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. 商品折扣后的最终价格”。希望您对单调栈算法有了更深入的了解!