题目描述
在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。
给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。
测试样例:
[10,22,5,75,65,80],6
返回:87
思路1:
动态规划:将股票价格序列,分为两部分,当前划分位置的最大收益=前一个子序列的最大收益+后一个子序列的最大收益
class Stock:
def maxProfit(self, prices, n):
arr=prices
arr_l,arr_r=[0]*n,[0]*n
for i in range(1,n):
if arr[i]-arr[i-1]+arr_l[i-1]>0:
arr_l[i]=arr[i]-arr[i-1]+arr_l[i-1]
for i in range(n-2,-1,-1):
if arr[i+1]-arr[i]+arr_r[i+1]>0:
arr_r[i]=arr[i+1]-arr[i]+arr_r[i+1]
max_n=0
for i in range(n):
max_c=max(arr_l[:i+1])+max(arr_r[i:])
max_n=max_c if max_c>max_n else max_n
return max_n
思路2:
# -*- coding:utf-8 -*-
class Stock:
def maxProfit(self, prices, n):
# write code here
buy1, buy2 = float('inf'),float('inf')
pro1,pro2 =0,0
for i in range(n):
buy1 = min(buy1,prices[i])
pro1 = max(pro1,prices[i]-buy1)
buy2 = min (buy2,prices[i] - pro1)
pro2 = max(pro2,prices[i] - buy2)
return pro2