题目描述:见链接
本文先讨论贪心算法的解决方案,当然动态规划也是可以的。
方法一:从后往前贪心
思路:从终点开始,寻找距离终点最远的,可以达到的地方;这就是贪心的思想,实现的时候,寻找从开始遍历,找到后,更新终点位置。
j = len(nums)-1
re = 0
while j > 0:
i = 0
while i < j:
if nums[i] + i >= j:
j = i
re += 1
break
i += 1
return re
方法二:同样贪心的思想,但是时间复杂度更好,较难理解
思路:从头到尾考虑,贪心的寻找,最大覆盖距离,即当前可以到达的最远距离。并且想要使用最少的次数。
重点:如果遍历中,i到达了当前最大覆盖距离curD,但是仍未到达终点,说明还需要再走一步;如果i能到达倒数第二个,根据题意,一定能到达终点,这样考虑就不用分多种情况,因为当i等于倒数第二个时:
- 如果此时i等于curD,说明还需一步,就可以到达终点。
- 如果此时i不等于curD,说明curD已经包含或超过终点,此时的step已经满足条件。
n = len(nums)
if n == 1: return 0
cover = 0
curD = 0
i = 0
re = 0
while i < n-1:
cover = max(cover, nums[i]+i)
if i == curD:
curD = cover
re += 1
i += 1
return re
ps:方法二通过代码随想录学习,讲解的更加详细