题目:
思路1:
暴力求解,用两层循环,用来寻找最大差值,非常简单(但在LeetCode上大概率出现超时的情况)
代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
ans = 0
if n == 0:
return 0
for i in range(n):
for j in range(i+1, n):
maxprice = prices[j] - prices[i]
ans = max(ans, maxprice)
return ans
思路2:
为了降低时间复杂度,这里我用到了动态规划的方法,动态规划最关键的点在于状态转移方程,设dp[i]
为当前两个数的最大差值,minprice
为最小值,则有dp[i] = max(dp[i - 1], prices[i] - minprice)
,因此就可以写代码了。
代码如下:
class Solution:
def maxProfit(self, prices: List[int]) -> int:
if len(prices) == 0:
return 0
dp = [0 for _ in range(len(prices))]
# 设minprice的初始值为prices的第0个值
minprice = prices[0]
for i in range(1, len(prices)):
# 从数组下标为1开始,更新最小值
minprice = min(minprice, prices[i])
# 每次都将最大差值加入dp
dp[i] = max(dp[i - 1], prices[i] - minprice)
# 此时的dp是顺序排列的,最后一个值就是最大的
return dp[-1]