买卖股票的最佳时机:122
这个题目想到利润是可以分解的,用贪心就是很简单了。(但是我想不到)为什么利润能分解,光体会这个一个我还想了半天呢。
举个例子:
例如第二天到第四天:
明眼人一看就知道应该从第二天买入,第四天卖出。
10-1=9这是最大的利润。
但这个可以是分解的,第三天-第二天的是4,第四天到第三天是5。我们把利润分解为每天为单位的维度,而不是从第二天到第四天的维度去思考。
所以,可以将单个间隔天的利润算出来,当作是一个profit数组,然后,只统计正数即可。
跳跃游戏:55
一刷,觉得这个题,使用贪心还是很有巧思的,不要拘泥于看一步,而是关键在于跳的覆盖范围!只要确定了范围,那肯定可以跳回去的。这个问题就可以转化为,跳跃的范围到底可不可以覆盖终点呢?
借随想录的图一用:
不过即便明白这个道理,我也不太会写代码,拿着这个题的题解赏析一下吧。
class Solution:
def canJump(self,nums):
cover=0
if len(nums)==1:
return True
i=0
while(i<=cover):
cover=max(i+nums[i],cover)
if cover>=(len(nums)-1):
return True
i=i+1
return False
注意cover是动态变化的,要记录cover的动态变化值。每次更新最大的cover值,就是可跳最大的范围。然后再判断跳的范围能不能覆盖终点。
跳跃游戏2:45
一刷,唉,觉得这个题目超级难,怎么才是中等难度。
本来以为能够在之前的基础上,适当的添加计数就可以,但是发现在自己想得简单了。不能按照“能走多远是多远”的思路了,这样没颁发统计中间的步数可以潜在的还能走多少步。所以需要记录curD。这个题还是继续要好好体会的,毕竟是45,还是挺重要的,思路要记住。
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums)==1:
return 0
curD=0
res=0
nextD=0
for i in range(len(nums)):
nextD=max(nums[i]+i,nextD)
if i==curD:
if curD!=len(nums)-1:
res=res+1
curD=nextD
if nextD>=len(nums)-1:
break
else:
break
return res
curD是当前覆盖的最远距离下标
res是记录走的最大步数
nextD是下一步覆盖的最远距离下标
然后进入for循环,nextD确定的是当前i的覆盖范围