题目:
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
解答:
方法一:暴力解法,超时
时间复杂度:O(n^2)
空间复杂度:O(1)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
#暴力解法
n=len(prices)
res=0
for i in range(n):
for j in range(i+1,n):
res=max(res,prices[j]-prices[i])
return res
方法二:贪心
class Solution:
def maxProfit(self, prices: List[int]) -> int:
#贪心,取最左最小值和最右最大值
n=len(prices)
res=0
low=prices[0]
for i in range(1,n):
low=min(low,prices[i])
res=max(res,prices[i]-low)
return res
方法三:动态规划
时间复杂度:O(n)
空间复杂度:O(n)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
#动态规划
#dp[i][0]:第i天持有股票所得最多现金
#dp[i][1]:第i天不持有股票所得最多现金
n=len(prices)
if n<=1:
return 0
dp=[[0]*2 for i in range(n)]
dp[0][0]=-prices[0]
for i in range(1,n):
dp[i][0]=max(dp[i-1][0],-prices[i])
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])
return max(dp[n-1])
#return dp[n-1][1]
方法三:动态规划,空间优化
时间复杂度:O(n)
空间复杂度:O(1)
class Solution:
def maxProfit(self, prices: List[int]) -> int:
#动态规划
#dp[i][0]:第i天持有股票所得最多现金
#dp[i][1]:第i天不持有股票所得最多现金
n=len(prices)
if n<=1:
return 0
dp=[[0]*2 for i in range(2)]
dp[0][0]=-prices[0]
for i in range(1,n):
dp[i%2][0]=max(dp[(i-1)%2][0],-prices[i])
dp[i%2][1]=max(dp[(i-1)%2][1],dp[(i-1)%2][0]+prices[i])
#return max(dp[(n-1)%2])
return dp[(n-1)%2][1]