买卖股票的最佳时机
题目描述:
![121](https://i-blog.csdnimg.cn/blog_migrate/14fff0eb4c68f223b07698bdd1c82bbe.png)
解题思路:
- 第一种:这个方法有点类似于求最大子序和的贪心算法。先保证这个
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
![1](https://i-blog.csdnimg.cn/blog_migrate/062aad235ee9ff14739cf913a31195e1.png)
- 第二种:这个方法就比较巧妙了,我们可以发现如果把这个
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
![2](https://i-blog.csdnimg.cn/blog_migrate/d12a9ebbd5e2d4167577141794c023d4.png)
- 第三种:这个方法是在第二个方法的基础上的改进,我们可以不需要重新定义一个列表就可以完成任务。通过
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
![3](https://i-blog.csdnimg.cn/blog_migrate/7dab3f5d091b31b48f0dd6dc03078c59.png)