#以数组形式输入一个非负数组的代码,数组中的每个数代表了从当前位置可以跳跃的最大长度。写一个函数判断是否能到达最后一个位置。 #样例 #A = [2,3,1,1,4],返回 true. #A = [3,2,1,0,4],返回 false. #注意事项 #1.贪心方法时间复杂度为O(N)。 #动态规划方法的时间复杂度为为O(n^2)。 #我们手动写一个贪心算法,时间复杂度为O(n)。 #贪心算法的思路是,我们每次都选择能跳的最远的位置进行跳跃,这样一直跳到最后。 #如果能跳到最后一个位置,那么就返回true,否则返回false。 #我们用一个变量reach来记录能跳到的最远位置,初始值为0。 #我们遍历整个数组,如果当前下标i小于等于reach并且i+ A[i]大于reach,那么我们更新reach为i+ A[i]。 #遍历结束后,我们判断reach是否大于等于数组长度。 #如果是,返回true,否则返回false。 #代码如下: #python语言的代码如下: def canJump(A): reach = 0 for i in range(len(A)): if i <= reach and i + A[i] > reach: reach = i + A[i] return reach >= len(A) print(canJump([2,3,1,1,4])) print(canJump([3,2,1,0,4])) #2.这个问题还可以用动态规划来解决。 #我们用一个数组dp来记录能否到达当前位置。 #dp[i] = true表示能到达当前位置,否则表示不能到达。 #初始值dp[0] = true。 #我们遍历整个数组,如果dp[i] = true,那么我们从i+1到i+A[i]都设置为true。 #遍历结束后,我们判断dp数组的最后一个值是否为true。 #如果是,返回true,否则返回false。 #python语言的代码如下: def canJump(A): dp = [False for i in range(len(A))] dp[0] = True for i in range(len(A)): if dp[i]: for j in range(i, min(i + A[i] + 1, len(A))): dp[j] = True return dp[len(A) - 1] print(canJump([2,3,1,1,4])) print(canJump([3,2,1,0,4])) #3.这个问题还可以用递归的方法来解决。 #我们用一个数组dp来记录能否到达当前位置。 #dp[i] = true表示能到达当前位置,否则表示不能到达。 #初始值dp[0] = true。 #我们用一个递归函数来判断能否到达当前位置。 #递归函数的参数是当前位置和数组A。 #如果当前位置大于等于数组长度,返回true。 #否则我们从当前位置+1到当前位置+A[i]进行递归。 #递归结束后,我们判断dp[i]是否为true。 #如果是,返回true,否则返回false。 #python语言的代码如下: def canJump(A): dp = [False for i in range(len(A))] dp[0] = True def jump(pos, A): if pos >= len(A): return True for i in range(pos, min(pos + A[pos] + 1, len(A))): if dp[i]: continue dp[i] = jump(i, A) if dp[i]: return True return False return jump(0, A) print(canJump([2,3,1,1,4])) print(canJump([3,2,1,0,4])) #4.这个问题还可以用广度优先搜索的方法来解决。 #我们用一个数组dp来记录能否到达当前位置。 #dp[i] = true表示能到达当前位置,否则表示不能到达。 #初始值dp[0] = true。 #我们用一个队列来记录当前位置。 #我们从0开始遍历数组,如果dp[i] = true,那么我们从i+1到i+A[i]都设置为true。 #遍历结束后,我们判断dp数组的最后一个值是否为true。 #如果是,返回true,否则返回false。 #python语言的代码如下: def canJump(A): dp = [False for i in range(len(A))] dp[0] = True queue = [0] while queue: pos = queue.pop(0) for i in range(pos, min(pos + A[pos] + 1, len(A))): if dp[i]: continue dp[i] = True queue.append(i) return dp[len(A) - 1] print(canJump([2,3,1,1,4])) print(canJump([3,2,1,0,4]))
2.28跳跃游戏解法
最新推荐文章于 2024-10-17 08:00:29 发布