回顾:
在贪心算法1中我们实现了分发饼干、摆动序列和最大子序和的问题。贪心算法没有固定的模板,需要具体问题具体分析例如分发饼干先将最大的饼干进行分发满足胃口最大的学生;摆动序列中利用curdiff和prediff记录是否达到峰值;最大子序和问题中当遇到当前和小于0那么将当前和归0,继续往下加和。
整体的思想就是需要找到解决问题的合适的规则,将规则实现。
122.买卖股票的最佳时机II
class Solution:
def maxProfit(self, prices: List[int]) -> int:
profit = 0
for i in range(len(prices)-1):
if prices[i+1]-prices[i]>0:
profit += prices[i+1]-prices[i]
return profit
55. 跳跃游戏
思路:关键在于在每一个点跳的时候可覆盖的范围是否可以包含终点位置。
每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。
不断更新跳跃的最大范围,用while循环更新条件实现范围的更新。
class Solution:
def canJump(self, nums: List[int]) -> bool:
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 += 1
return False
45.跳跃游戏II
思路: 仍然是求解最大的覆盖范围,通过求解最大覆盖范围找到相应的数值,但问题是如何找到最小的跳跃次数。
具体实现方法: 记录当前的最大覆盖范围和下一步的最大覆盖范围,将当前的所有路径都进行遍历即可。
class Solution:
def jump(self, nums: List[int]) -> int:
if len(nums) == 1 : return 0
curDistance = 0
ans = 0
nextDistance = 0
for i in range(0,len(nums)):
nextDistance = max(nums[i] + i, nextDistance) # 更新下一步的最远距离
if i == curDistance: # 当前步的所有步均遍历完成,交给下一个nextDistance进行遍历
if curDistance < len(nums)-1:
ans += 1
curDistance = nextDistance
if nextDistance >= len(nums)-1 : break
else : break
return ans