121. 买卖股票的最佳时机
题目描述
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
题解
1.方法:暴力法
我们需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。
形式上,对于每组 ii 和 jj(其中 j > ij>i)我们需要找出 max(prices[j]−prices[i])。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
ans = 0
for i in range(len(prices)):
for j in range(i + 1, len(prices)):
ans = max(ans, prices[j] - prices[i])
return ans
复杂度分析
时间复杂度:O(n^2)
空间复杂度:O(1)。只使用了常数个变量。
2. 遍历法
显然,如果我们真的在买卖股票,我们肯定会想:如果我是在历史最低点买的股票就好了!
我们只要用一个变量记录一个历史最低价格 minprice,假设第一个是最低点,然后比较第i天的最低价,我们在第 i 天卖出股票能得到的利润就是 prices[i] - minprice。或者0
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if (len(prices)<=1):
return 0
min_p=prices[0]
max_p=0
for i in range(len(prices)):
min_p= min(min_p,prices[i])
max_p= max(max_p,prices[i]-min_p)
return max_p