给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
class Solution {
public int jump(int[] nums) {
int n = nums.length;
if( n == 1)return 0;
int ans = 0;
// 若i超过curDis,则ans++
int curDis = 0;
// 若nextDis到达终点,则ans++
int nextDis = 0;
for( int i = 0; i < n; i++ ) {
nextDis = Math.max( nextDis, i+nums[i] );
if( i == curDis) {
ans ++;
curDis = nextDis ;
if( curDis >= n-1 ) {
return ans;
}
}
}
return ans;
// int[] steps = new int[n];
// for( int i = 0; i < n; i++ ) {
// steps[i] = 100000;
// }
// steps[0] = 0;
// int cover = 0;
// for( int i = 0; i <= cover; i++ ) {
// if( i >= n ) break;
// if( cover < ( i + nums[i] )) {
// cover = i + nums[i];
// for( int j = i + 1; j <= i + nums[i]; j++ ) {
// if(j == n) break;
// steps[j] = Math.min( steps[j] , steps[i] + 1 );
// }
// }
// }
// return steps[n-1];
}
}
该题的方法很值得借鉴,直接将复杂度降到了O(N)。我觉得这题要搞清nextDis,与curDis之间的关系。nextDis就是在当前可以到达的最远距离内,下一次可以到达的最远距离,curDis下一次的值就是最大的nextDis,当i==curDis时候说明要再走一步了,step应该加一。