首页 > 代码库 > leetcode. Jump Game

leetcode. Jump Game

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属于[0, n - 2], a[i] + i >= n - 1.

假设我们已经知道了n-1时的结果,能否推出n时的结果呢?我们记n = k时结果为ret[k].

1)如果ret[k-1] = false, 那么显然ret[k]=false.

2)若ret[k-1] = true,  必须存在i属于[0, k - 1], a[i] + i >= k, 那么ret[k] = true, 否则,ret[k] = false;

 1     bool canJump(int A[], int n)  2     { 3         int *ret = new int[n], result; 4         ret[0] = true; 5         for (int i = 1; i < n; i++) 6         { 7             int max_pos = 0; 8             if (ret[i - 1] == false) 9                 return false;10 11             for (int j = 0; j < i; j++)12             {13                 max_pos = (A[j] + j) > max_pos ? (A[j] + j) : max_pos;14             }15 16             if (max_pos >= i)17                 ret[i] = true;18             else19                 ret[i] = false;20         }21         result = ret[n - 1];22         delete[] ret;23         return result;24 }

此时运行出现Time Limit Exceed, 运行超时。

仔细分析,11-14行的for循环是不需要的,可以申请max_pos[n]数组,保存每次得到的最大max_pos即可。

 1 bool canJump(int A[], int n)  2     { 3         int *ret = new int[n], result; 4         int *max_pos = new int[n]; 5         ret[0] = true; 6         max_pos[0] = A[0] + 0; 7         for (int i = 1; i < n; i++) 8         { 9             if (ret[i - 1] == false)10                 return false;11 12             max_pos[i] = max(max_pos[i - 1], (A[i] + i));13             if (max_pos[i - 1] >= i)14                 ret[i] = true;15             else16                 ret[i] = false;17         }18         19         result = ret[n - 1];20         delete[] ret;21         delete[] max_pos;22         23         return result;24     }

 

leetcode. Jump Game