122.买卖股票的最佳时机||
局部最优:收集每天的正利润,全局最优:求得最大利润
class Solution:
def maxProfit(self, prices: List[int]) -> int:
result=0
for i in range(1,len(prices)):
result+=max(prices[i]-prices[i-1],0)#负数的不算
return result
55.跳跃游戏
其实跳几步无所谓,关键在于可跳的覆盖范围
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution:
def canJump(self, nums: List[int]) -> bool:
cover=0
if len(nums)==0:
return True
i=0
while i<=cover:
cover=max(i+nums[i],cover)#找到最大覆盖量
if cover>=len(nums)-1:
return True
i+=1
return False
45.跳跃游戏||
所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!
这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。
这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时
- 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
- 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
-
class Solution: def jump(self, nums: List[int]) -> int: if len(nums)==1: return 0 cur_distance=0#当前覆盖最远距离下标 ans=0#记录走的最大步数 next_distance=0#下一步覆盖的最远距离下标 for i in range(len(nums)): next_distance=max(nums[i]+i,next_distance)#更新下一步最远距离下标 if i==cur_distance:#遇到当前覆盖最远距离下标 ans+=1#需要走下一步 cur_distance=next_distance#更新当前覆盖最远距离下标 if cur_distance>=len(nums)-1: break return ans#每一片覆盖范围都取最远
法二:其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了
-
class Solution: def jump(self, nums: List[int]) -> int: cur_distance=0#当前覆盖最远距离下标 ans=0#记录走的最大步数 next_distance=0#下一步覆盖的最远距离下标 for i in range(len(nums)-1): next_distance=max(nums[i]+i,next_distance) if i==cur_distance: cur_distance=next_distance ans+=1 return ans