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]
853

被折叠的 条评论
为什么被折叠?



