121. Best Time to Buy and Sell Stock
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/
solution
贪心: 只能进行一笔买卖交易
# 一次迭代过程,只记录之前出现的最低值,也计算目前出现的最大利润。两种计算非同时触发
class Solution:
def maxProfit(self, prices: List[int]) -> int:
low = float('inf')
profit = 0
for price in prices:
if price < low: # 可转化为 low = min(low, i), 截止到目前遇到的最低价格
low = price
if price - low > profit: # 可转化为 profit = max(profit, i - low), 截止目前的最大利润
profit = price - low
return profit时间复杂度:O(n) 空间复杂度:O(1)
动态规划
dp含义很关键,注意
dp[i][0]和dp[i][1]分布是持有和不持有股票,手里最多现金。持有可以是原来就持有,也可以是当天才买。不持有可以是一直不持有,可以是当天才卖。初始可以认为现金是0,可以初始假设了某笔钱,最后也需要减掉。然后,中间如果有亏损,本身也是负的现金
时间复杂度:O(n) 空间复杂度:O(n)
follow up-股票买卖类
122. Best Time to Buy and Sell Stock II
可以进行无数笔交易,注意先买后卖
递增区间的和
dp含义不变,只是公式有更新
时间复杂度:O(n) 空间复杂度:O(n)
123. Best Time to Buy and Sell Stock III
最多完成两笔交易
dp含义差不多?类似问题中,二维dp中的第二维是某种状态枚举
时间复杂度:O(n) 空间复杂度:O(n), 可继续优化至O(1)
188. Best Time to Buy and Sell Stock IV
最多完成k笔交易
把最多完成两笔交易中的2进一步参数化
时间复杂度:O(n) 空间复杂度:O()
309. Best Time to Buy and Sell Stock with Cooldown
含冷冻期
注意状态划分与转移,仍然是第二维是状态
时间复杂度:O(n) 空间复杂度:O()
714. Best Time to Buy and Sell Stock with Transaction Fee
含交易手续费
和122类似,卖出时加上手续费
时间复杂度:O(n) 空间复杂度:O()
Last updated