代码随想录算法训练营第41天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

1.121. 买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机
文档讲解: 代码随想录

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        #贪心
        if len(prices) == 1:
            return 0
        count = 0
        res = 0
        for i in range(1, len(prices)):
            count += prices[i] - prices[i - 1]
            if count < 0:
                count = 0
            else:
                res = max(res, count)
        return res

通过之后才发现题目中说到股票只能买卖一次,但是以上贪心的思路也是可以解释清楚的。求出利润列表之后求最大的累加和,那么以[1,3,6]举例,6-1和6-3+3-1的结果是一样的,是可以等同的。

动态规划:
(1)确定数组和下标
对于每天,定义两个状态,dp[i][0]表示持有股票的最大金额,dp[i][1]表示不持有股票的最大金额
(2)递推关系式
dp[i][0]:持有股票有两种情况,一种是股票在之前买入,那么则为dp[i - 1][0];另一种是在本轮买入,则为-prices[i],取最大值;dp[i][1]:不持有股票的两种情况,一种是之前就卖掉了,则为dp[i-1][1];另一种是在本轮卖出,则为dp[i-1][0]+prices[i],取最大值
(3)初始化
dp[0][0]=-prices[0],dp[0][1]=0
(4)遍历顺序:从前往后
(5)打印数组

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        dp = [[0,0] for _ in prices]
        dp[0][0] = -prices[0]
        for i in range(1, len(prices)):
            dp[i][0] = max(dp[i - 1][0], -prices[i])
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i])
        return max(dp[-1][0], dp[-1][1])

2.122.买卖股票的最佳时机II

题目链接:122.买卖股票的最佳时机II
文档讲解: 代码随想录

这道题与1不同的是
(1)确定数组和下标
对于每天,定义两个状态,dp[i][0]表示持有股票的最大金额,dp[i][1]表示不持有股票的最大金额
(2)递推关系式
dp[i][0]:持有股票有两种情况,一种是股票在之前买入,那么则为dp[i - 1][0];另一种是在本轮买入,则为dp[i][1]-prices[i],取最大值;dp[i][1]:不持有股票的两种情况,一种是之前就卖掉了,则为dp[i-1][1];另一种是在本轮卖出,则为dp[i-1][0]+prices[i],取最大值
(3)初始化
dp[0][0]=-prices[0],dp[0][1]=0
(4)遍历顺序:从前往后
(5)打印数组

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        if len(prices) == 1:
            return 0

        dp = [[0,0] for _ in prices]
        dp[0][0] = -prices[0]
        for i in range(1, len(prices)):
            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 max(dp[-1][0], dp[-1][1])

3.123.买卖股票的最佳时机III

题目链接:123.买卖股票的最佳时机III
文档讲解: 代码随想录

(1)确定数组和下标
dp[i][0]表示第一次持有股票,dp[i][1]表示第一次不持有,dp[i][2]表示第二次持有,dp[i][3]表示第二次不持有
(2)递推关系式
dp[i][0]:之前已经买入,dp[i-1][0];在本轮买入,-prices[i];两者取最大值;dp[i][1]:之前就已经卖出,dp[i-1][1];在本轮卖出,为dp[i-1][0] + prices[i];取最大值;dp[i][2]:之前买入,则为dp[i-1][2];在本轮买入,dp[i-1][1] - prices[i];取最大值;dp[i][3]:之前卖出,dp[i-1][3];在本轮卖出,dp[i-1][2] + prices[i];取最大值
(3)初始化
dp[0][0]= - prices[0];dp[0][1]=0;dp[0][2]=- prices[0];dp[0][3]=0;因为可以在同一天重复买入卖出
(4)遍历顺序:从前往后
(5)打印数组

class Solution(object):
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        dp = [[0] * 4 for _ in prices]
        dp[0][0] = -prices[0]
        dp[0][2] = -prices[0]
        for i in range(1, len(prices)):
            dp[i][0] = max(dp[i-1][0], -prices[i])
            dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i])
            dp[i][2] = max(dp[i-1][2], dp[i-1][1] - prices[i])
            dp[i][3] = max(dp[i-1][3], dp[i-1][2] + prices[i])
        return dp[-1][3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值