您的位置:首页 > 其它

Leetcode 55. Jump Game

2018-02-07 22:32 387 查看
Given an array of non-negative integers, you are initially positioned at the first index of the array.Each element in the array represents your maximum jump length at that position.Determine if you are able to reach the last index.For example:
A = 
[2,3,1,1,4]
, return 
true
.A = 
[3,2,1,0,4]
, return 
false
.要判断是否可以到达最后一个点,可以先找到可以到达最后的那个节点i,然后再去看i前面的节点能不能到达i,如此循环下去直到找到i=0的那一点: public boolean canJump(int[] nums) {
int n = nums.length;
int all = n-1;//当前需要到达的位置
for(int i=0;i<all;i++)
{
if(i+nums[i]>=all)
{
all = i;
i=-1;//从0开始遍历找到第一个到达all的节点
}
}

return all==0;
}
但是上述的代码会超时,因为你每更新all一次都要从0开始找第一个到达all的节点,所以我们可以进行优化优化1:我们可以从最后节点开始往前找,那么每次就不用从投开始遍历了,要知道能否到达n-1,就看一下最后一个可以到达n-1的点是哪个i,然后再看最后一个到达i的点是哪个,知道i=0,只用从后往前遍历一次就好: public boolean canJump(int[] nums) {
//7ms
int n = nums.length;
int all = n-1;
for(int i=n-1;i>=0;i--)
{
if(i+nums[i]>=all) all = i;//当前的节点不能到达
}

return true;
}

另一种算法是,我们从0开始找,看每次能到达的最远节点是哪,用farest来表示,那只要当前节点i是farest能到达的,就能更新farest,知道farest到达n-1。 public boolean canJump(int[] nums) {
//9ms
int n = nums.length;
int farest = 0;
for(int i=0;i<n;i++)
{
if(farest<i) return false;//当前的节点不能到达
farest = Math.max(farest, i+nums[i]);
if(farest>=n-1)
return true;
}

return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: