121. 买卖股票的最佳时机
1. first idea
追涨杀跌嘛。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。 每一个位置只有卖掉和不卖。
而哪一天买入是由哪一天考虑卖出决定的, 就是在考虑的当天之前最低价格对应的那一天。
但是哪天买入不重要,当天之前的最低价格是多少才重要。
dp[i]表示第i天时能够获得的最大总利润。
不卖,那第i-1天能取得的最大利润是第i天以前能取得的最大利润。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [0] * len(prices)
dp[0] = 0
min_price = prices[0]
for idx in range(1, len(dp)):
min_price = min(prices[idx - 1], min_price)
dp[idx] = max(prices[idx] - min_price, dp[idx - 1])
return dp[-1]
2. doc reading
感觉这次代码随想录的想法太复杂了。
122. 买卖股票的最佳时机 II
1. first idea
只要是递增的相邻两天,我们就买入再卖出,实现只要是涨我们就获利的目的。
这个都不需要动态规划。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
sum_int = 0
for idx in range(1, len(prices)):
sum_int += (prices[idx] - prices[idx - 1]) if (prices[idx] - prices[idx - 1]) > 0 else 0
return sum_int
2. doc reading
用一下动态规划的思路
dp[i][0]表示第i天持有股票,所得最大利润,它应该
- 如果前一天持有,和
dp[i - 1][0]一致。 - 如果前一天不持有,
dp[i][0] = dp[i - 1][1] - price[i]
dp[i][1]表示第i天不持有股票,所得最大利润:
- 如果前一天持有,现在卖出
dp[i][1] = dp[i - 1][0] + price[i] - 如果前一天也没有,
dp[i][1] = dp[i - 1][1]
初始化:dp[0][1] = 0 且 dp[0][0] = -price[0]
结果一定是最后一天且不持有的最大利润。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dp = [[0, 0] for _ in range(len(prices))]
dp[0][0] = - prices[0]
for idx in range(1, len(prices)):
# 持有
dp[idx][0] = max(dp[idx - 1][0], dp[idx - 1][1] - prices[idx])
# 不持有
dp[idx][1] = max(dp[idx - 1][1], dp[idx - 1][0] + prices[idx])
return dp[-1][1]