首页 > 试题广场 >

跳跃游戏

[编程题]跳跃游戏
  • 热度指数:13966 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给出一个非负整数数组,你最初在数组第一个元素的位置

数组中的元素代表你在这个位置可以跳跃的最大长度
判断你是否能到达数组最后一个元素的位置
例如

A =[2,3,1,1,4], 返回 true.

A =[3,2,1,0,4], 返回 false.

示例1

输入

[2,3,1,1,4]

输出

true
示例2

输入

[3,2,1,0,4]

输出

false
import java.util.*;


public class Solution {
    /**
     * 
     * @param nums int整型一维数组 
     * @return bool布尔型
     */
    public boolean canJump (int[] nums) {
        // write code here
        // 当前可到达的最远位置
		int manLen = 0;
		for (int i = 0; i < nums.length; i++) {
			if (manLen >= i) {
				int tempLen = i + nums[i];
				manLen = Math.max(manLen, tempLen);
			}
			if (manLen >= nums.length - 1){
				return true;
			}
		}
		return false;
    }
}

发表于 2020-08-02 09:48:29 回复(0)
public class Solution {
    public boolean canJump(int[] A) {
        if (A == null || A.length == 0) {
            return false;
        }
        int k = 0;
        for (int i = 0; i < A.length; i++) {
            if (k < i) {
                return false;
            }
            k = Math.max(k, i + A[i]);
        }
        return true;
    }
}
发表于 2019-11-09 14:26:19 回复(0)
public class Solution {
public static boolean canJump(int[] A) {
int n=A.length;
int i=0;
int step =A[0];
if(step==0&&n==1)
return true;
while(i0)
{
i=i+step;
if(i>=n-1)
return true;
else
step=A[i];
}
else
return false;
}
return true;
}
}
编辑于 2018-01-09 20:11:16 回复(0)
public class Solution {
    public boolean canJump(int[] A) {
        int n = A.length-1;
        if(n<=0)
            {
            return true;
        }
    
        int maxJump = 0;
        for(int i=0;i<n;i++)
            {
            if(A[i]==0)
                {
                if(maxJump<=(A[i]+i))
                    {
                    return false;
                }
            }
            if((A[i]+i)>maxJump)
                {
                maxJump = A[i]+i;
            }
        }
        return maxJump>=n?true:false;
    }
}
发表于 2017-08-20 20:07:21 回复(0)
public class Solution {
    public boolean canJump(int[] A) {
        if(A.length <= 1)
             return true;
        int maxdis = 0, maxdis_p = 0;
        for(int i=0; i<A.length; i++) {
            if(maxdis >= A.length-1)
                return true;
            if(i > maxdis_p) {
                maxdis_p = maxdis;
            	if(maxdis_p < i)
                    return false;
            }
            maxdis = Math.max(maxdis, A[i] + i);
        }
        return false;
    }
}

发表于 2017-06-19 18:04:29 回复(0)
public class Solution {
    public boolean canJump(int[] A) {
		boolean[] flag = new boolean[A.length];
		flag[0] = true;
		for (int i = 0; i < A.length; i ++) {
			if(flag[i]) {
				int maxPosition = Math.min(i + A[i], A.length - 1);
				for (int j = i + 1; j <= maxPosition; j ++) {
					flag[j] = true;
				}
			}
			if(flag[A.length - 1]) return true;
		}
		return false;
	}
}

编辑于 2017-03-25 16:35:33 回复(0)

Idea is to work backwards from the last index. Keep track of the smallest index that can "jump" to the last index. Check whether the current index can jump to this smallest index.

bool canJump(int A[], int n) { int last=n-1,i,j; for(i=n-2;i>=0;i--){ if(i+A[i]>=last)last=i;
    } return last<=0;
}
发表于 2017-03-12 12:38:54 回复(0)