首页 > 试题广场 >

买卖股票的最好时机(二)

[编程题]买卖股票的最好时机(二)
  • 热度指数:42047 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票
2. 如果不能获取收益,请返回0
3. 假设买入卖出均无手续费

数据范围:
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度
示例1

输入

[8,9,2,5,4,7,1]

输出

7

说明

在第1天(股票价格=8)买入,第2天(股票价格=9)卖出,获利9-8=1
在第3天(股票价格=2)买入,第4天(股票价格=5)卖出,获利5-2=3
在第5天(股票价格=4)买入,第6天(股票价格=7)卖出,获利7-4=3
总获利1+3+3=7,返回7        
示例2

输入

[5,4,3,2,1]

输出

0

说明

由于每天股票都在跌,因此不进行任何交易最优。最大收益为0。            
示例3

输入

[1,2,3,4,5]

输出

4

说明

第一天买进,最后一天卖出最优。中间的当天买进当天卖出不影响最终结果。最大收益为4。                

备注:
总天数不大于200000。保证股票每一天的价格在[1,100]范围内。
python 动态规划 股票买卖问题
class Solution:
    def maxProfit(self , prices ):
        # write code here
        # dp[i][j]定义为前i天在状态j(0/1 -> 不持股/持股)下的最高收益
        length = len(prices)
        dp = [[0]*2 for _ in range(length+1)]
        # basecase 第0天持股不可能发生
        dp[0][1] = -float('INF')
        for i in range(1,length+1):
            # 对应接下来的每一天,可能会有两种最终状态(持股/不持股)
            # 若到第i天不持股,有两种可能
            # 1.昨天不持股->今天依旧不持股  2.昨天持股->今天按当天价格卖出
            dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i-1])
            # 若到第i天持股,也有两种可能
            # 1.昨天持股->今天依旧持股  2.昨天不持股->今天按当天价格买入股
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]-prices[i-1])
        # 返回最后一天的最大收益 即不持有股票的状态
        # 因为最后一天肯定是全部股票折现的收益更大
        return dp[length][0]
上述dp转移过程仅与前一天dp有关系,所以可进行空间优化
class Solution:
    def maxProfit(self , prices ):
        # write code here
        length = len(prices)
        dp_i_0 = 0
        dp_i_1 = -float('INF')
        for i in range(1,length+1):
            temp = dp_i_0
            dp_i_0 = max(dp_i_0, dp_i_1+prices[i-1])
            dp_i_1 = max(dp_i_1, temp-prices[i-1])
        # 返回最后一天的最大收益(即不持有股票的状态)
        return dp_i_0


编辑于 2021-07-25 15:30:29 回复(0)
class Solution:
    def maxProfit(self , prices ):
        # write code here
        profit = 0
        for i in range(1, len(prices)):
            if prices[i] > prices[i-1]:
                profit += prices[i]-prices[i-1]
        return profit


发表于 2021-03-12 20:59:19 回复(0)