陪伴式刷题Day 28:用贪心算法轻松攻克「122.买卖股票的最佳时机 II」
2023-10-18 08:14:00
掌握贪心算法,轻松搞定股票买卖难题——详解「122.买卖股票的最佳时机 II」
引言
各位算法爱好者,欢迎来到我们的陪伴式刷题之旅!今天,我们将深入探索 LeetCode 上的经典算法题「122.买卖股票的最佳时机 II」。这道题乍一看似乎有些棘手,但别担心,只要我们掌握了贪心算法的精髓,就能轻松将其攻克。准备好开启这段算法探险了吗?
题目解析
「122.买卖股票的最佳时机 II」这道题要求我们在一个允许无限次交易、但每次交易都需要支付手续费的股票市场中,找到一种交易策略,最大化我们的利润。
示例:
考虑以下示例:
输入:prices = [7,1,5,3,6,4], fee = 1
输出:5
在这组数据中,我们的目标是在给定的股票价格数组 prices
中找到一组交易,使得我们的利润最大化。通过观察,我们可以采用以下策略:
- 在第一天,以 7 美元的价格买入股票。
- 在第二天,以 1 美元的价格卖出股票,获利 6 美元,扣除手续费 1 美元,实际获利为 5 美元。
- 在第三天,以 5 美元的价格买入股票。
- 在第四天,以 3 美元的价格卖出股票,获利 2 美元,扣除手续费 1 美元,实际获利为 1 美元。
- 在第五天,以 6 美元的价格买入股票。
- 在第六天,以 4 美元的价格卖出股票,获利 2 美元,扣除手续费 1 美元,实际获利为 1 美元。
采用上述策略,我们的总利润为 5 美元。
解题思路
这道题的本质是利用贪心算法,不断地低买高卖,从而实现利润最大化。贪心算法的特点是在每个步骤都做出局部最优选择,从而达到全局最优解。
具体来说,我们的贪心策略如下:
- 买入股票: 当我们发现股票价格低于前一天的价格时,我们就买入股票。
- 卖出股票: 当我们发现股票价格高于前一天的价格时,我们就卖出股票。
通过这种策略,我们可以不断地在市场中寻找低价买入和高价卖出的机会,从而积累利润。
代码实现
我们使用 Python 代码来实现上述贪心算法:
def maxProfit(prices, fee):
"""
:type prices: List[int]
:type fee: int
:rtype: int
"""
profit = 0 # 初始化利润为 0
has_stock = False # 初始化持股状态为 False
for price in prices:
# 如果没有持股
if not has_stock:
# 如果当前股票价格低于前一天的价格
if price < prices[prices.index(price) - 1]:
# 买入股票
has_stock = True
# 记录买入价格
buy_price = price
# 如果有持股
else:
# 如果当前股票价格高于前一天的价格
if price > prices[prices.index(price) - 1]:
# 卖出股票
has_stock = False
# 计算利润
profit += price - buy_price - fee
return profit
测试用例
prices = [7, 1, 5, 3, 6, 4]
fee = 1
result = maxProfit(prices, fee)
print(result) # 输出:5
prices = [1, 3, 2, 8, 4, 9]
fee = 2
result = maxProfit(prices, fee)
print(result) # 输出:8
总结
通过贪心算法,我们成功地解决了「122.买卖股票的最佳时机 II」这道算法题。贪心算法在解决这类问题中表现出强大的优势,它能够在有限的时间和资源内找到局部最优解,从而达到全局最优解。
常见问题解答
1. 贪心算法是否总是能找到最优解?
答:不,贪心算法并不总是能找到最优解,它只能保证找到局部最优解。
2. 除了贪心算法,还有哪些算法可以解决这道题?
答:动态规划算法也是解决这类问题的常用方法。
3. 这道题中的手续费会影响我们的交易策略吗?
答:是的,手续费的存在会影响我们的交易策略,我们需要考虑手续费的因素,才能最大化利润。
4. 如果股票价格出现大幅波动,这道题的解法是否会改变?
答:是的,如果股票价格出现大幅波动,我们的解法可能需要进行调整,以适应不同的市场情况。
5. 这道题在实际股票交易中是否有应用价值?
答:是的,这道题的解法可以应用于实际股票交易中,帮助投资者制定有效的交易策略。
结束语
希望这篇文章能帮助你深入理解「122.买卖股票的最佳时机 II」这道算法题,并掌握贪心算法的精髓。在算法学习的道路上,不断地练习和探索,你终将成为算法高手!