题目
给定一个数组,它的第i个元素是一支给定股票第i天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
思路
暴力法
卖出第i天所能获得的做大利润d[i],取决于nums[i] - min(nums[j]), j <= i
创建一个dp_table,用于保存第i天卖出能获得的最大利润。
一次遍历
对于当前i卖出buy_out能获得的最大利润,只和i以前的最低买入价格buy_in有关。
使用一个变量记录最低买入价格lowest_buy_out,第i天抛出能得到的最大利润就是prices[i] - lowest_buy_out。
代码
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_ans = 0
for i in range(len(prices)):
low_buy_in = prices[i]
for j in range(0, i):
low_buy_in = min(low_buy_in, prices[j])
if prices[i] - low_buy_in > max_ans:
max_ans = prices[i] - low_buy_in
return max_ans
空间复杂度:O(1)
时间复杂度:O(n^2)
时间复杂度超了。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_ans = 0
lowest_buy_in = float('INF')
for i in range(len(prices)):
if prices[i] < lowest_buy_in:
lowest_buy_in = prices[i]
max_ans = max(max_ans, prices[i] - lowest_buy_in)
return max_ans
空间复杂度:O(1)
时间复杂度:O(n)