剑指 Offer 63. 股票的最大利润https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/
解题思路:
设共有 n 天,第 a 天买,第 b天卖,则需保证 a < b(因为卖出需大于买入,不能买了接着卖) ;可
第1天买,可以第2天卖,第3天卖,...,第n天卖,总共(n-1)种交易方案
第2天买,可以第3天卖,第4天卖,...,第n天卖,总共(n-2)种交易方案
。。。
推出交易方案数共有:
(n - 1) + (n - 2) +。。。 + 2 + 1 = n(n - 1) / 2
因此,暴力法的时间复杂度为 O(n^2)O(n
2考虑使用动态规划降低时间复杂度,以下按照流程解题。
动态规划解析:
状态定义: 设动态规划列表 dp ,dp[i] 代表以 prices[i]为结尾的子数组的最大利润,
即第i天卖出的最大利润。
转移方程: 由于题目限定 “买卖该股票一次” ,因此第i 日卖出的最大利润 dp[i]等于第 i - 1天最大利润 dp[i-1] 和第 i天卖出的最大利润中的最大值。
第i 日最大利润 = max(第 (i-1) 日最大利润, 第 i 日价格 - 前 i 日最低价格)
前i日最大利润=max(前(i−1)日最大利润,第i日价格−前i日最低价格)
dp[i]=max(dp[i−1],prices[i]−min(prices[0:i]))
初始状态: dp[0] = 0 ,即首日利润为 0 ;
返回值: dp[n - 1]] ,其中 n为 价格列表长度。
'''
class Solution:
def maxProfit(self,lst):
#cost=float("inf")
dp=[0]
for i in range(1,len(lst)):
#dp[i]=max(dp[i-1],lst[i]-min(lst[0:i]))
dp.append(max(dp[i-1],lst[i]-min(lst[0:i])))
return dp[len(lst)-1]
'''
'''
class Solution:
def maxProfit(self,lst):
if not lst:return 0#提交代码调试出来的
dp=[0]
cost=lst[0]
for i in range(1,len(lst)):
#dp[i]=max(dp[i-1],lst[i]-min(lst[0:i]))
cost=min(cost,lst[i])
dp.append(max(dp[i-1],lst[i]-cost))
return dp[len(lst)-1]
'''
class Solution:
def maxProfit(self,lst):
cost,profit=float("inf"),0
for price in lst:
cost=min(cost,price)
profit=max(profit,price-cost)
return profit
a=Solution()
lst1=[7,1,5,3,6,4]
lst2=[7,6,4,3,1]
print(a. maxProfit(lst1))
print(a. maxProfit(lst2))