代码随想录算法训练营第三十二天|122. 买卖股票的最佳时机II,55. 跳跃游戏,45. 跳跃游戏II
122. 买卖股票的最佳时机II
题目链接:买卖股票的最佳时机II
这个题的贪心,就是只收集正收益的天数。
如果是第0天买第三天卖,利润为prices[3]-prices[0] = (prices[3]-prices[2]) + (prices[2]-prices[1]) + (prices[1]-prices[0]) + prices[0],也就是每天买卖,所以只看隔天就行了。
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:
m=0
for i in range(len(nums)):
m=max(m,(i+nums[i]))
if m >= (len(nums)-1):
return True
elif m < i+1:
return False
return False
45. 跳跃游戏II
题目链接:跳跃游戏II
这里的一个贪心的思路就是,按照最大的覆盖范围往前走,如果到头了也没到最后一格,就更新之前在路上收集到的更大的覆盖范围接着往下走。
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums) == 1: return 0
curcover = 0
nextcover = 0 #在当前就要统计下一步的覆盖范围,一旦当前覆盖走不下去了就要更新
res = 0
for i in range(len(nums)):
# 收集下一步的覆盖范围
nextcover = max(i+nums[i],nextcover) # 只记录最大的
#当i走到现在覆盖范围的尽头还是没到最后一格,那就去增加覆盖范围,增加的就是之前找到的最大的下一步覆盖范围
# 意思是这条路走不通了,要换一条走的更远的往下。
# nextcover收集的是到curcover为止,最大的下一步覆盖
if i == curcover:
if curcover != len(nums)-1:
# 再往下走一步
res += 1
curcover = nextcover
if curcover >= len(nums)-1:
break
elif curcover >= len(nums)-1:
break
return res