这道题我的思想总是要在列出所有可能的跳法上徘徊。误区
第一种方法:如果某一位置有0,就从这个位置开始往前看,如果有一种情况能跳过0就继续往下一个位置走,如果没有的话那就返回false。因为使用for循环遍历所以0的位置都是从前往后数。
代码:
class Solution {
public boolean canJump(int[] nums) {
if(nums.length==1) return true;
for (int i =0;i<nums.length-1;i++)//这里要注意,最后一个位置就不进行遍历了。
{
if (nums[i]==0)
{
if(passzero(nums,i)) continue;
else return false;
}
}
return true;
}
public boolean passzero(int[] nums,int index)
{
for(int i =index-1;i>=0;i--)
{
if((i+nums[i])>index)
{
return true;
}
}
return false;
}
}
第二种思想就是要维护一个最长距离,最长距离等于index+nums[index].如果上一个位置能到达的最长距离大于当前位置 ,那么当前位置也能遍历到。然后就在当前位置重新计算最长能到达的位置。如果在中途某一个位置的最长距离可以直接判断能到达最后,那就直接返回true,或者中途有一个位置判断出是无法到达的就可以直接返回false.
public class Solution {
public boolean canJump(int[] nums) {
int n = nums.length;
int rightmost = 0;
for (int i = 0; i < n; ++i) {
if (i <= rightmost) {
rightmost = Math.max(rightmost, i + nums[i]);
if (rightmost >= n - 1) {
return true;
}
}
}
return false;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/jump-game/solution/tiao-yue-you-xi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
bool canJump(vector<int>& nums)
{
int k = 0;
for (int i = 0; i < nums.size(); i++)
{
if (i > k) return false;
k = max(k, i + nums[i]);
}
return true;
}
作者:ikaruga
链接:https://leetcode-cn.com/problems/jump-game/solution/55-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结:第三种解法的代码量最少但是运算效率还没有第一种复杂的代码运算效率高,此外占用的内存也是最大的。