买卖股票的最佳时机Ⅱ
题目描述:
解题思路:
- 第一种:这个思路也是很简单的,我发现这里有个很神奇的地方,就是这里我们只需要把这个数组中的所有相邻元素的差值算出来,然后将这些元素中大于零的数的和求出来,这就是我们所需要的最大利润。原理也很简单,就是当你在算最大利润的时候,每次股票的利润都是卖出的那天价格减去买入的价格,因为我们不限制买卖股票的数量,那么我们就把只要是盈利的价格都加在一起,而盈利的价格就是上面所说的相邻元素差值中的大于零的数,说明这段区间就是盈利的,然后加在一起就很容易得到最大利润。
- 时间复杂度:O(N) 。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
dic = []
Sum = 0
for i in range(1, len(prices)):
dic.append(prices[i] - prices[i-1])
if dic[i-1] > 0:
Sum = Sum + dic[i-1]
else:
continue
return Sum
- 第二种:这里用到的方法也很厉害。从代码也很容易理解,就是我们只要发现第一天价格小于第二天价格,我们就在这天买入,然后第二天卖出。方法也很暴力。
- 时间复杂度:O(N) 。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
Sum = 0
for i in range(1, len(prices)):
if prices[i-1] < prices[i]:
Sum += prices[i] - prices[i-1]
return Sum
- 第三种:这里我看到了一位大佬的解法,觉得很厉害,于是就挂在这里收藏…,这里就1行代码确实厉害,但是我对这种写法并不是特别了解。大概的解法就是用
zip()
函数将prices
和prices[i:]
这两个数组中对应的元素打包成一个个元组,然后a
和b
分别对应这些数组的各个位置元素,然后从头开始遍历,如果b > a
,后面的元素大于前面的,也就是盈利,那么就把所有的这些盈利的值用sum()
加起来,最后返回。 - 时间复杂度:O(N) 。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
return sum(b - a for a, b in zip(prices, prices[1:]) if b > a)