classSolution:defmaxProfit(self, prices: List[int])->int:# 贪心思想:借鉴最大子数组和那一题连续和的思想,连续和定义为未来价格减去当前价格,表示预知未来的涨和跌,涨的时候把收益累加,移动指针表示卖出,未来跌的时候,移动指针表示买入操作进行抄底
res =0
day =len(prices)
i=0while i<day-1:
future=prices[i+1]-prices[i]if future>0:
res+=future
i+=1return res
# 反思1:classSolution:defmaxProfit(self, prices: List[int])->int:# 贪心思想:巧妙写法
res =0
day =len(prices)for i inrange(day-1):
res+=max(0,prices[i+1]-prices[i])return res
思路二:动态规划
#超时法,二维dp数组classSolution:defmaxProfit(self, prices: List[int])->int:# 动态规划:每天都有两个状态买或者卖,定义其最大收益,找到和历史数据的关系
day =len(prices)
dp =[[0,0]]#第0天,买入和卖出收益都是0for i inrange(1,day):
dp.append([0,0])
dp[i][0]=dp[i-1][1]#为0表示买入,为1表示卖出;某天买入的收益,和前一天卖出的收益一样for j inrange(i+1):#若在第i天卖出,则前面的每一天都可能是买入日,都需要考虑
dp[i][1]=max(dp[j][0]+prices[i]-prices[j],dp[i][1])#这里和自身比,是因为从0遍历到i有很多次这个值的迭代returnmax(dp[-1][0],dp[-1][1])# 一维dp数组,和贪心思路很像classSolution:defmaxProfit(self, prices: List[int])->int:# 动态规划:dp[i]定义为第i天的最大收益,因为可以多次交易,则最好最长持有天数不超过一天,在超过一天时,只有每天都涨才能保持最高收益,若区间有跌落,则非最大收益。转化为连续最大和问题
day =len(prices)
dp =[0]*(day)for i inrange(1,day):#,若第i天买入,则第i天收益和第i-1天一样;若第I天卖出,则第i天的收益为i-1天最大收益加上最后一天收益
dp[i]=max(dp[i-1],dp[i-1]+prices[i]-prices[i-1])#和贪心非常像了 return dp[-1]#dp第三种理解!!二维dp矩阵也可以一个for循环拿下,厉害!classSolution:defmaxProfit(self, prices: List[int])->int:# 动态规划:#dp[i][0]表示第i天持有股票时,手头的现金(第i-1天可能持有,若没,则说明第i天买入了)#dp[i][1]表示第i天没持有股票时手头的现金(若第i-1天持有了,说明第i天卖了,若没持有,说明卖出还在前面)#则最后的最大收益手上一定没有持有股票,也就是dp[-1][1]
dp =[[0,0]]
dp[0][0]-=prices[0]#表示若第一天就持有,说明花钱买了股票,则手头的钱是负的for i inrange(1,len(prices)):
dp.append([0,0])
dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i])
dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])return dp[-1][1]
classSolution:defjump(self, nums: List[int])->int:#延续上题覆盖距离的思路,不过本题需要两个,一个是当前的最远距离,一个是下一步的最远距离iflen(nums)==1:return0
cur,nex =0,0#cur用来记录当前的res步数时,可以到达的最远处,若当前可以覆盖到末尾,则直接返回当
res =0#前的步数res,如果覆盖不到结尾,说明还需要走下一步,而下一步的起点就是cur范围里的任意一个for i inrange(len(nums)):#为使每一步尽可能的远,则用nex记录cur范围内可以达到的最远的地方,若是走到cur还没有到尽头,说明需要走下一步
nex =max(nums[i]+i,nex)#i一直往前走,直到当前i能走到的极限,期间记录下一步达到的最远距离,记为nexif i == cur:#走到i的索引的尽头if cur <len(nums)-1:
cur =nex
res+=1if cur >=len(nums)-1:breakelse:breakreturn res
# 反思1: