难度:简单
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
思路:因为股票就买卖一次,所以贪心算法的逻辑就是取区间左侧最小值,取区间右侧最大值,得到的差值就是最大利润。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
low = float("inf")
result = 0
for i in range(len(prices)):
low = min(low, prices[i]) #取最左最小价格
result = max(result, prices[i] - low) #直接取最大区间利润
return result
难度:中等
给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格。
在每一天,你可能会决定购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以购买它,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
思路:采用贪心算法,这里等同于每天买卖股票,实现最大利润。
只需要我们每天收集整理正利润即可,收集正利润的区间就是股票买卖点区间,而我们只需要关注最终利润,不需要记录区间。那么只收集正利润是贪心算法所“贪”的地方。
局部最优:收集每天正利润
全局最优:求最大利润
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
if len(prices)==1:
return 0
z=0
for i in range(1,len(prices)):
j=prices[i]-prices[i-1]
if j>0:
z+=j
return z
#时间复杂度O(n)
#空间复杂度O(1)
难度:困难
给定一个数组,它的第 i
个元素是一支给定的股票在第 i
天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if len(prices) == 0:
return 0
dp = [0] * 5
dp[1] = -prices[0]
dp[3] = -prices[0]
for i in range(1, len(prices)):
dp[1] = max(dp[1], dp[0] - prices[i])
dp[2] = max(dp[2], dp[1] + prices[i])
dp[3] = max(dp[3], dp[2] - prices[i])
dp[4] = max(dp[4], dp[3] + prices[i])
return dp[4]