leetcode刷题笔记——122.买卖股票的最佳时机 II

一、题目描述、

给定一个整数数组 prices,其中 prices[i] 表示某支股票第 i 天的价格。在这个问题中,你可以在任意一天决定购买和/或出售股票,但在任何时候最多只能持有一股股票。你也可以在同一天购买后立即出售。目标是返回你能获得的最大利润。

输入输出示例

  • 示例1

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

        输出:7

        解释:在第 2 天(价格 = 1)买入,在第 3 天(价格 = 5)卖出,利润 = 4。然后在第 4 天(价格 = 3)买入,在第 5 天(价格 = 6)卖出,利润 = 3。最大总利润 = 4 + 3 = 7。

  • 示例2

        输入:prices = [1,2,3,4,5]

        输出:4

        解释:在第 1 天(价格 = 1)买入,在第 5 天(价格 = 5)卖出,利润=4。最大总利润=4。

  • 示例3

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

        输出:0

        解释:无法获得正利润,因此不参与交易,最大利润为 0。

约束条件

  • 你可以在任意一天买入和/或卖出股票。

  • 在任何时刻最多只能持有一股股票。

  • 可以在同一天买入并卖出。

二、解题思路以及代码实现

方法 1:贪心算法(相邻差值法)

解题思路

每当遇到价格上涨的情况,就进行交易。具体来说,如果第二天的价格高于今天的价格,就可以把今天的股票卖出,获取利润。

具体步骤

  • 初始化 max_profit 为 0,表示初始没有利润。

  • 从第二天开始遍历价格数组(从索引 1 到 n-1)。

  • 对于每一天,检查今天的价格与昨天的价格:

    • 如果今天的价格 prices[i] 大于昨天的价格 prices[i - 1],则计算利润并累加到 max_profit 中:

      • 利润计算公式为 prices[i] - prices[i - 1]

  • 返回 max_profit,即为最大利润。

代码实现

def maxProfit(prices):
    max_profit = 0  # 初始化最大利润为0
    
    for i in range(1, len(prices)):
        if prices[i] > prices[i - 1]:  # 如果今天的价格高于昨天的价格
            max_profit += prices[i] - prices[i - 1]  # 累加利润
    
    return max_profit

复杂度分析

  • 时间复杂度:O(n),n 为价格数组的长度。

  • 空间复杂度:O(1),只使用常量空间。

方法 2:动态规划(仅计算累积利润)

解题思路

动态规划方法本质上与贪心算法相似,但它强调通过状态转移来解决问题。在本题中,每次价格上涨的情况仍然是关键。

具体步骤

  • 初始化 max_profit 为 0,表示初始没有利润。

  • 遍历价格数组,从第一天到倒数第二天(从索引 0 到 n-2):

    • 对于每一天,计算当前价格与下一天价格的差值。

    • 使用 max(0, prices[i + 1] - prices[i]) 来计算利润:

      • 如果差值为正(即价格上涨),则累加到 max_profit

      • 如果差值为负(即价格下跌),则不进行交易,保持利润为 0。

  • 返回 max_profit,即为最大利润。

代码实现

def maxProfit(prices):
    max_profit = 0  # 初始化最大利润为0
    
    for i in range(len(prices) - 1):
        # 计算今天和明天的价格差值
        max_profit += max(0, prices[i + 1] - prices[i])  # 仅累加正利润
    
    return max_profit

复杂度分析

  • 时间复杂度:O(n),n 为价格数组的长度。

  • 空间复杂度:O(1),只使用常量空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值