题目描述:
题解一:贪心
参考
情况一:
一直增长:[1,2,3,4,5] result=2-1+3-2+4-3+5-4=4 与第一天买入,最后一天卖出相同。
情况二:
一直下降:利润为0, 不存在一个i,prices[i]>prices[i-1]
情况三:
先增长再下降:[a b c] a-b增长,b-c下降,a-b段prices[i]-prices[i-1]的和与b-a相等。
情况四:
先下降再增长:[a b c] a-b下降,b-c增长,b-c段prices[i]-prices[i-1]的和与b-c相等。
class Solution: def maxProfit(self, prices: List[int]) -> int: result = 0 for i in range(1,len(prices)): if prices[i]>prices[i-1]: result = result+prices[i]-prices[i-1] return result
题解二:动态规划
1.dp[i][0]表示第i天不持有股票的收益,dp[i][1]表示第i天持有股票的收益,dp[0][0]初始化为0,dp[0][1]初始化为-prices[0],表示在第0天买入的收益。
2.dp[i][0]=max(前一天不持有股票的收益dp[i-1][0],前一天持有股票在第i天以prices[i]卖出)
dp[i][1]=max(前一天持有股票的收益dp[i][1],前一天不持有股票但在第i天以prices[i]买入)
3.返回dp[len(prices)-1][0],因为最后一天不能持有股票。
class Solution: def maxProfit(self, prices: List[int]) -> int: 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): 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]) print(dp) return dp[n-1][0]