创见博客
买卖股票的最佳时机2
七崽爱吃小饼干2025/12/19阅读 0专栏 算法合集

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。然而,你可以在 同一天 多次买卖该股票,但要确保你持有的股票不超过一股。

返回 你能获得的 最大 利润 。

示例 1:

codeType
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
最大总利润为 4 + 3 = 7 。

示例 2:

codeType
输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
最大总利润为 4 。

示例 3:

codeType
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。

提示:

codeType
1 <= prices.length <= 3 * 104
0 <= prices[i] <= 104

解法:

解法一:贪心算法

python
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        '''
        第一种解法,贪心算法
        由于买入和卖出的次数不受限制,且同时手里只能最多有一支股票。
        我们可以直接计算当天买入和次天卖出是否有利润,如果有就买且卖。没有则不买。
        将利润累计即可获得最大利润
        '''
        maxprofit = 0
        n = len(prices)
        for i in range(0, n - 1):
            maxprofit += max(0, prices[i + 1] - prices[i])
        return maxprofit

解法二:动态规划

以 7、1、5、3、6、4为例子

因为该题的当天状态只需要通过前一天的状态进行推算,所以实际还可以进一步优化空间复杂度,只需要保留前一天的状态就行。

python
class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        '''
        第一种解法,动态规划
        一天结束以后有两种状态,手里有股票和没有股票,每次都记录前一天的两种状态的最好结果。
        当天的状态就能通过前一天的结果进行计算。
        状态一:如果今天手里没有股票,那么当前的最佳利润就是 max(前一天手里没有股票且今天也没买, 前一天手里有股票并且按今天的价格卖出) dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
        状态二:如果今天手里有股票,那么当前的最佳利润就是 max(前一天手里有股票且没卖, 前一天手里没股票且买了当天的股票) dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])
        最后一天手里没有股票的情况肯定就是最终能获得的最大收益也就是dp[n-1][0]
        '''
        n = len(prices)
        dp = [[0] * 2 for _ in range(0, n)]
        dp[0][0], dp[0][1] = 0, -prices[0]
        for i in range(1, n):
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i])
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i])
        return dp[n-1][0]
评论
0/100