121. 买卖股票的最佳时机(简单)

https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 难度:☆☆☆
        # 本题只能买1次,卖1次,买卖不能同1天
        # 方法1:贪心
        # 找到历史价格最低,就在那天买,然后找到一天卖出
        # maxprofit = 0
        # minprice = float('inf')
        # for price in prices:
        #     minprice = min(price, minprice)
        #     maxprofit = max(maxprofit, price - minprice)
        # return maxprofit

        # 方法2:动态规划
        # 定义dp:
            # dp[i][0] 在第i天结束时,未只有该股票,获得最大利润
                # ① 昨天也没有持股,今天无操作,利润不变
                # ② 昨天持股了,今天卖出,利润增加
            # dp[i][1]在第i天结束时,持有该股票,获得最大利润
                # ① 昨天持股,今天无操作,利润不变
                # ② 昨天不持股,今天买入股票,利润减少

        # n = len(prices)
        # dp = [[0] * 2 for i in range(n)]
        
        # # 初始化
        # dp[0][0] = 0
        # dp[0][1] = -prices[0]

        # # 遍历递归
        # for i in range(1, n):
        #     # 第i天没持股 = max(前1天没持股,前1天你持股了且今天卖了)
        #     dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i])
        #     # 第i天持股 = max(前1天持股, 前1天没持股且今天买了)
        #     dp[i][1] = max(dp[i - 1][1],  -prices[i])
        
        # # 最终输出时,肯定是未持股状态,只有卖了股票手中才有钱
        # return dp[-1][0]

        # 方法3:换个思路
        # 不考虑是买还是卖,只考虑最大化手中的钱
        # 买相当于减,卖相当于加,无论是买还是卖,要保证手中的钱最多
        # 当次的买或卖只与上一次是买还是卖相关
        # buy = max(buy, 0-p或者sell - p), sell = max(sell, buy + p)
        # buy的时候注意了,第一次buy时手中原有0元,非第一次buy时手中原有sell元
        buy, sell = -float('inf'), 0 # 买后手中钱减少,初始化为无穷小;卖后手中钱增加,初始化为0
        for p in prices:
            # 先买后卖
            buy = max(buy, 0-p)  # 只能买卖1次,买前手中钱为0,买后手中钱变为-p
            sell = max(sell, buy + p)  # 卖之前一定是买,卖完手里钱变为buy + p
        return sell

你可能感兴趣的:(动态规划,贪心,python,数据结构,leetcode,算法)