Leetcode daily 20/03/09 买卖股票的最佳时机 笔记
买卖股票的最佳时机
-题目-
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
-示例1-
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
-示例2-
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
-方法1-
- 设置变量
max_value
记录最大利润。 - 遍历数组:
- 数组第\(i\)个价格,即买入价格
price_buy
和在其之后的最大价格,即卖出价格sell_price
作差:price_sell - price_buy
,得到买入价格price_buy
的最大利润max_i
。 - 取最大利润
max_value
和当天买入价格price_buy
的最大利润max_i
较大值为max_value
- 数组第\(i\)个价格,即买入价格
- 最终的
max_value
为结果。
-ac代码-
class Solution:
def maxProfit(self, prices: List[int]) -> int:
max_value = 0
for i in range(len(prices)):
price_buy = prices[i]
price_sell = max(prices[i:])
max_i = price_sell - price_buy
max_value = max(max_i, max_value)
return max_value
-复杂度-
- \(T(n) = O(n^2)\)
- \(S(n) = O(1)\)
-方法2-
- 设置变量记录最低价格
min_value
,最大利润max_profit
。 - 遍历数组。对每一个价格
price
:- 最低价格
min_value
与当前价格price
比较取较小,更新最低价格min_value
。 - 当前价格
price
和最低价格min_value
的差与最大利润max_profit
取较大,更新最大利润max_profit
。
- 最低价格
- 最终最大利润
max_profit
为结果。
-ac代码-
class Solution:
def maxProfit(self, prices: List[int]) -> int:
min_value = float("inf")
max_profit = 0
for price in prices:
min_value = min(price, min_value)
max_profit = max(max_profit, price - min_value)
return max_profit
-复杂度-
- \(T(n) = O(n)\)
- \(S(n) = O(1)\)
-笔记-
- 题目-笔记:不一定是数组最大减最小。
- 算法-笔记:对序列类变量,判断是否需要针对空序列增加操作,特别是用到索引操作时。空序列可看成特例。
- python-笔记:需要最小化的变量的初始值可设置为
float("inf")
。 - 算法-todo:无序列表找最大值的方法。
- 题目-问题:
def maxProfit(self, prices: List[int]) -> int:
if not prices:
return 0
max_value = 0
for buy_idx in range(len(prices)):
for sell_idx in range(buy_idx + 1, len(prices)):
max_value = max(prices[sell_idx] - prices[buy_idx], max_value)
这段代码复杂度也是\(O(n^2)\),为啥超时?