之所以说leetcode的测试用例有问题,是因为我刚开始理解错了题意,写下了如下的错误的代码。但是却AC了。
错误代码为:
bool canJump(int A[], int n) { if(n == 0) return true; int sum = 0; //记录当前的最远距离 int i = 0; while(i < n) { if(A[i] != 0) { i+= A[i]; } else { break; } } if(i >= n-1) return true; return false; }
上述代码有问题,理解错误,直接举反例:2,5,0,0,0上述代码的结果为false。但是实际应该是true;
因此建议不要相信leetcode AC的代码,自己还需要更小心。当然如果你想的算法是正确的,就不会出现上述算法完全是错的,但是却AC了。
题目描述:
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
.
题目分析:从第0个位置出发是否可以到达最后一个元素,如果从第一个点可以到达最后一个点,那么显然其中的每一个点都是可以到达的。这就可以使用贪心的算法。
大致执行过程如下:
首先,查看第一个元素能到达的位置范围为[0, A[0]],那么也就是说0到A[0]中间的所有的点都可到达,那么这些点能够到达的范围是什么呢?只需要将能到达范围内的元素按照上述方式全部遍历一遍,看起能够到达的范围最终是否到达了n。
代码如下:
bool canJump(int A[], int n) { if(n == 0) return true; int right = 0; //the reached right-most position for(int i = 0 ; i <= right && right < n-1 ; ++i) { right = max(right,i+A[i]); } return right >= (n-1); }
right用来保存最右边能够到达的位置。
Leetcode的bug测试用例 ?? jump game,布布扣,bubuko.com