您的位置:首页 > 其它

leetcode(55):Jump Game

2016-08-09 21:59 525 查看
原题:

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.

分析:给定一个非负整数数组,下标起始位置为第一个元素,判断能否通过根据数组的元素大小跳跃到达最后一个元素,例如例子1中在第一个元素位置可以最多跳跃两个元素,在第二个元素位置最多可以跳跃三个元素,以此类推,直到到达最后一个元素。

直观的思路是设置一个长度为数组nums的长度大小的布尔数组flag[],来记录该位置的元素是否有可达。初始状态全部设置为false,即为不可达。

遍历nums数组,根据元素的数字大小,将后续能到达的元素设置为true,即为可达状态。遍历完之后判断最后一个元素的状态是否可达。

Java代码如下:

public boolean canJump(int[] nums){
int len = nums.length;
boolean[] flag = new boolean[len];
for (int i = 0; i < flag.length; i++) {
flag[i]=false;
}
flag[0]=true;
for (int i = 0; i < nums.length; i++) {
if(flag[i]){
for (int j = 1; j <= nums[i] && (i+j)<nums.length; j++) {
flag[i+j]=true;
}
}
}
return flag[len-1];
}


时间复杂度为O(n^2),空间复杂度为O(n),显然,在大数据量的情况下会出现超时Time Limit Exceeded。

改进的思路:

flag这个数组不再单纯地存可达或不可达这样的bool值,而是存储从0位置出发的最大可达长度。定义数组int canWalkLength
,canWalkLength[i]表示到达 i 位置后,依然有余力走出的最大长度。如果canWalkLength[i] < 0,表示走不到位置i。

状态转移方程为:canWalkLength[i] = max(canWalkLength[i-1], nums[i-1]) - 1

java实现:时间复杂度为O(n),空间复杂度为O(n)

public boolean canJump(int[] nums){
int len = nums.length;
if(nums[0]>=len-1) return true;
int[] canWalkLength=new int[len];
canWalkLength[0]=nums[0];
for (int i = 1; i < nums.length; i++) {
canWalkLength[i]=Math.max(canWalkLength[i-1], nums[i-1])-1;
if(canWalkLength[i]<0) return false;
}
return canWalkLength[len-1]>=0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: