返回

陪伴式刷题Day 28:用贪心算法轻松攻克「122.买卖股票的最佳时机 II」

后端

掌握贪心算法,轻松搞定股票买卖难题——详解「122.买卖股票的最佳时机 II」

引言

各位算法爱好者,欢迎来到我们的陪伴式刷题之旅!今天,我们将深入探索 LeetCode 上的经典算法题「122.买卖股票的最佳时机 II」。这道题乍一看似乎有些棘手,但别担心,只要我们掌握了贪心算法的精髓,就能轻松将其攻克。准备好开启这段算法探险了吗?

题目解析

「122.买卖股票的最佳时机 II」这道题要求我们在一个允许无限次交易、但每次交易都需要支付手续费的股票市场中,找到一种交易策略,最大化我们的利润。

示例:

考虑以下示例:

输入:prices = [7,1,5,3,6,4], fee = 1
输出:5

在这组数据中,我们的目标是在给定的股票价格数组 prices 中找到一组交易,使得我们的利润最大化。通过观察,我们可以采用以下策略:

  1. 在第一天,以 7 美元的价格买入股票。
  2. 在第二天,以 1 美元的价格卖出股票,获利 6 美元,扣除手续费 1 美元,实际获利为 5 美元。
  3. 在第三天,以 5 美元的价格买入股票。
  4. 在第四天,以 3 美元的价格卖出股票,获利 2 美元,扣除手续费 1 美元,实际获利为 1 美元。
  5. 在第五天,以 6 美元的价格买入股票。
  6. 在第六天,以 4 美元的价格卖出股票,获利 2 美元,扣除手续费 1 美元,实际获利为 1 美元。

采用上述策略,我们的总利润为 5 美元。

解题思路

这道题的本质是利用贪心算法,不断地低买高卖,从而实现利润最大化。贪心算法的特点是在每个步骤都做出局部最优选择,从而达到全局最优解。

具体来说,我们的贪心策略如下:

  1. 买入股票: 当我们发现股票价格低于前一天的价格时,我们就买入股票。
  2. 卖出股票: 当我们发现股票价格高于前一天的价格时,我们就卖出股票。

通过这种策略,我们可以不断地在市场中寻找低价买入和高价卖出的机会,从而积累利润。

代码实现

我们使用 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」这道算法题,并掌握贪心算法的精髓。在算法学习的道路上,不断地练习和探索,你终将成为算法高手!