LeetCode-55-跳跃游戏
原题链接
描述
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
示例
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
思路一
动态规划。首先假设终点是 i,在到达终点的前一个状态所在的是 j(如果存在的话),到达终点时只有一种情况:j < i 并且 nums[ j ] >= i - j。而初始状态,只有 k 中可能,k 是 num[0] 的数。
解答一
class Solution {
public static boolean canJump(int[] nums) {
int len = nums.length;
boolean[] dp = new boolean[len];
dp[0] = true;
for (int i = 1; i < len; ++i) {
dp[i] = false;
for (int j = 0; j < i; ++j) {
if (dp[j] && j + nums[j] >= i) {
dp[i] = true;
break;
}
}
}
return dp[len - 1];
}
}
思路二
贪心。在每个地方总是选择走得最远的长度并记录,当该长度大于等于 nums.length - 1 的时候说明可以到达最后一个下标从头开始遍历数组,比较从当前点走的最大长度和和已知的最大长度max比较,更新max 使总是当前最大。
解答二
class Solution2 {
public static boolean canJump(int[] nums) {
if (nums == null || nums.length <= 1) {
return true;
}
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
if (i > max) {
return false;
}
max = Math.max(i + nums[i], max);
if (max >= nums.length - 1) {
return true;
}
}
return max >= nums.length - 1;
}
public static void main(String[] args) {
int[] a = {2,3,1,1,4};
System.out.println(canJump(a));
}
}
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15182442.html

LeetCode-55-跳跃游戏
浙公网安备 33010602011771号