一开始用了DP,大数据超时了。
超时的版本:
public class Solution {
public boolean canJump(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
int len = A.length;
if (len == 0 || len == 1) return true;
boolean m[] = new boolean[len];
m[0] = true;
for (int i = 0; i < len; i++) {
for (int j = 0; j < i; j++) {
if (i - j <= A[j] && m[j]) {
m[i] = true;
continue;
}
}
}
return m[len-1];
}
}
后来也思维一转,直接从前往后扫就是了,,但感觉复杂度没有本质区别,果然还是超时。
后来再看了网上的参考,理解到本质上,只有A[i]为0(或负数)的情况下,才会不能继续往前跳,那么从左向右扫,并维持一个当前能跳到的最远的距离就行了。
public class Solution {
public boolean canJump(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
int len = A.length;
if (len == 0 || len == 1) return true;
int max = 0;
for (int i = 0; i < len; i++) {
if (A[i] <= 0 && i == max) {
return false;
}
else {
if (A[i] > 0 && A[i] + i > max) {
max = A[i] + i;
}
}
if (max >= len - 1) return true;
}
return false;
}
}
第二刷:Annie的版本更漂亮 https://github.com/AnnieKim/LeetCode/blob/master/JumpGame.h
class Solution {
public:
bool canJump(int A[], int n) {
int maxLen = 0;
for (int i = 0; i < n; i++)
{
if (maxLen >= n - 1)
return true;
if (i > maxLen)
return false;
int curMax = i + A[i];
maxLen = max(maxLen, curMax);
}
}
};