跳跃游戏题目的思路探讨与源码
跳跃游戏的题目如下图,该题属于数组类的题目,主要考察对于贪心算法的理解以及题目本身的理解,通过考虑在一次遍历的过程里,每一次去比较当前下标与当前值的加和与下一个元素的下标之间的大小来得到最终的结果。本人没有想出其他的方法法,使用了两种略微不同的算法,本质上其实都是贪心算法,而不同的是一个是从初始位置向后遍历,另一个是从倒数第二个位置向前遍历,前一种使用的是Python编写,后一种使用的是Java编写,该题思路较为基础,但需要理解题目本身的含义。
本人认为该题目可以使用贪心算法,本题中贪心算法的核心就是:1)如果最大可达位置是比当前元素的下标要小的,则认为无法到达最终位置,返回False;否则则继续向后移动,每一次移动都去将最大可达位置进行更新,即当前元素的下标和当前元素的值之和与历史最大的可达位置进行比较。
#喷火龙与水箭龟
class Solution:
def canJump(self, nums: List[int]) -> bool:
resFlag=0
Num=len(nums)
for ij in range(Num):
if(ij>resFlag):
return False
resFlag=max(resFlag,ij+nums[ij])
return True
而上述的算法思路是从开始的位置向后推,使用贪心算法,每次都要保留最大的可达位置;还有一种方法是从最后面向前推,也是需要保留可达的最大位置,其具体的思路是:将初始的位置设为倒数第二个下标,最大的下标记为最后一个元素的下标;每一次比较的是当前下标的值和当前下标之和是否比最大下标更大,如果更大证明可达,则将最大下标向前移到当前下标的位置;反之则不处理。最终看最大下标是否在第一个元素上,如果是则证明整体可达,如果不是则证明不可达。
#喷火龙与水箭龟
class Solution {
public boolean canJump(int[] nums) {
int FinalRes = nums.length-1;
for (int ij = FinalRes-1;ij>=0;ij--){
int tp = nums[ij]+ij;
if(tp>=FinalRes){
FinalRes=ij;
}
}
return FinalRes==0;
}
}
从结果来说是不管是正推还是倒推都是可以的,但是应该可以进一步提速,希望朋友们能够多多指教,非常感谢。