122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II
122.买卖股票的最佳时机II
只有一只股票!当前只有买股票或者卖股票的操作。想获得利润至少要两天为一个交易单元。
如果想到其实最终利润是可以分解的,那么本题就很容易了!就是把利润分解为每天为单位的维度,而不是从0天到第3天整体去考虑!
局部最优:收集每天的正利润,全局最优:求得最大利润。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
res = 0
for i in range(len(prices) - 1):
profit = prices[i+1] - prices[i]
if profit > 0:
res += profit
return res
55. 跳跃游戏
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。
而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。如果cover大于等于了终点下标,直接return true就可以了。
class Solution:
def canJump(self, nums: List[int]) -> bool:
if len(nums) == 1: return True
cover = 0
i = 0
while i <= cover:
cover = max(cover, i + nums[i])
if cover >= len(nums) - 1:
return True
i += 1
return False
45.跳跃游戏II
很难!!!!需要多多复习!!!!
方法一:
移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。
当移动下标达到了当前覆盖的最远距离下标时,如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums) == 1: return 0
curDistance = 0
nextDistance = 0
step = 0
for i in range(len(nums)):
nextDistance = max(nextDistance, i + nums[i])
if i == curDistance:
if curDistance <= len(nums) - 1:
step += 1
curDistance = nextDistance
if nextDistance >= len(nums)-1:
break
else:
break
return step
方法二:
class Solution:
def jump(self, nums: List[int]) -> int:
length = len(nums)
if length <= 1: return 0
step = 1
left, right = 0, nums[0]
while right < length - 1:
for i in range(left, right + 1):
if nums[i]+i > right:
right = nums[i] + i
left = i + 1
step += 1
return step