买卖股票的最佳时机
题目描述:

解题思路:
- 第一种:这个方法有点类似于求最大子序和的贪心算法。先保证这个
prices数组不是空列表,然后先假设最小值mini为prices[0],然后一次比较列表中元素,发现更小的元素则重新赋值给mini,然后每次都通过prices[i] - mini获得一次最大利润maxi,最后返回最终得到的最大利润maxi。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
lens = len(prices)
if lens == 0:
return 0
else:
mini = prices[0]
maxi = 0
for i in range(lens):
mini = min(mini, prices[i])
maxi = max(maxi, prices[i] - mini)
return maxi

- 第二种:这个方法就比较巧妙了,我们可以发现如果把这个
prices列表的相邻两个元素的差我们算出来然后放在另一个列表里,很容易推得,要求最大利润,也就是列表里的这两个元素之间的差,也就是这两个元素之间的所有相邻元素的差的和。所以这道题就简化变成了求这些差的最大子序和。我们先定义一个列表,然后用append()来把所有差放进去。后面就用之前用过求解最大子序和的方法,来求解就可以了。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
lens = len(prices)
cha = []
for i in range(len(prices)-1):
cha.append(prices[i+1]-prices[i])
if len(cha) == 0:
return 0
else:
temp = maxi = cha[0]
for i in range(1, len(cha)):
temp = max(cha[i], cha[i]+temp)
maxi = max(maxi, temp)
if maxi < 0:
return 0
else:
return maxi

- 第三种:这个方法是在第二个方法的基础上的改进,我们可以不需要重新定义一个列表就可以完成任务。通过
max函数把小于0的差排除,又通过prices[i+1] - prices[i] + temp可以进行最大子序和的计算,每次得到的最大值赋给maxi,最后返回maxi。这个方法空间复杂度比上一个方法要小。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
lens = len(prices)
temp = maxi = 0
for i in range(lens-1):
temp = max(0, prices[i+1] - prices[i] + temp)
maxi = max(temp, maxi)
return maxi
