买卖股票的最佳时机 II

举报
程序员学长 发表于 2022/01/21 20:02:27 2022/01/21
【摘要】 读前福利,送大家一些电子书 买卖股票的最佳时机 IILeetCode 122. 买卖股票的最佳时机 II 问题描述给定一个数组 prices,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 分析问题这个问题的解题思路和上题类...

读前福利送大家一些电子书

买卖股票的最佳时机 II

LeetCode 122. 买卖股票的最佳时机 II

问题描述

给定一个数组 prices,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

分析问题

这个问题的解题思路和上题类似,也是“多阶段决策最优”问题。也符合动态规划解题模型。不过这里的“状态”会有所区别,我们来看一下。考虑到 “不能同时参与多笔交易”。所以,每天交易结束后手里只可能存在有股票和没有股票两种状态。所以,我们可以用二个数组来表示,其中dp1[i]表示第i天交易后,手里没有股票的最大利润。dp2[i]表示第i天交易完成后,手里有股票的最大利润。

dp1[i]表示第i天手里没有股票的最大利润,那么这个状态要么是由dp1[i-1],即前一天手里没有股票的最大利润,转移过来。要么由dp2[i-1]+prices[i],即前一天手里有股票,今天把这个股票卖出。所以dp1[i]的状态转移方程为:

dp1[i]=max(dp1[i-1],dp2[i-1]+prices[i])

dp2[i]表示第i天手里有股票的最大利润,那么这个状态要么是由dp2[i-1],即前一天手里有股票的最大利润,转移过来。要么由dp1[i-1]-prices[i],即前一天手里没有股票,今天把这个股票进行买入。所以dp2[i]的状态转移方程为:

dp2[i]=max(dp2[i-1],dp1[i-1]-prices[i])

所以我们代码实现如下所示:

def maxProfit(prices):
    n=len(prices)
    if n==0:
        return 0
    dp1=[0]*n
    dp2=[0]*n
    #手里没有股票
    dp1[0]=0
    #手里有股票
    dp2[0]=-prices[0]
    for i in range(1,n):
        dp1[i]=max(dp1[i-1],dp2[i-1]+prices[i])
        dp2[i]=max(dp2[i-1],dp1[i-1]-prices[i])

    return dp1[n-1]

prices=[7, 1, 5, 3, 6, 4]
print(maxProfit(prices))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。