开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情.
题目链接: leetcode.com/problems/ju…
1. 题目介绍(Jump Game)
You are given an integer array nums. You are initially positioned at the array's first index, and each element in the array represents your maximum jump length at that position.
【Translate】: 给你一个整数数组nums。初始位置是数组的第一个索引,数组中的每个元素表示在该位置的最大跳转长度。
Return true if you can reach the last index, or false otherwise.
【Translate】: 如果您能到达最后一个索引,则返回true,否则返回false。
【测试用例】:
示例1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
【约束】:
2. 题解
2.1 贪心 -- O(n)
原题解来自于hllowrld的 6 line java solution in O(n)。解题思路就是通过贪心的思想,找到当前的最大一跳,并判断当前的最大跳数是否能够到达下一目标,如果不行,则返回false.
public boolean canJump(int[] nums) {
int reachable = 0;
for (int i=0; i<nums.length; ++i) {
if (i > reachable) return false;
reachable = Math.max(reachable, i + nums[i]);
}
return true;
}
2.2 倒序遍历
原题解来自于mlblount45的 Java 98% Percentile Solution。通过倒序检查元素,每当元素为0时,判断是否可以跳过,不能则返回false,能则下一跳。
public class Solution {
public boolean canJump(int[] nums) {
if(nums.length < 2) return true;
for(int curr = nums.length-2; curr>=0;curr--){
if(nums[curr] == 0){
int neededJumps = 1;
while(neededJumps > nums[curr]){
neededJumps++;
curr--;
if(curr < 0) return false;
}
}
}
return true;
}
}