题目详情
- 本题与跳楼梯很像, 但是跳的最大台阶数是不确定的
暴力解
dp暴力解
O(n2) + O(n)
public int jump(int[] nums) {
if(nums==null||nums.length<2) return 0;
int n = nums.length;
int[] f = new int [n];
f[0] = 0;
for(int i=1; i<n; i++){
f[i] = 10001;
for(int j=0; j<i; j++){
if(nums[j]+j>=i)
f[i] = Math.min(f[i],f[j]+1);
}
}
return f[n-1];
}
贪心解法
O(n) + O(1)
public int jump(int[] nums) {
if(nums==null||nums.length<2) return 0;
int n = nums.length;
int curReach = 0;
int nextCanReach = 0;
int cnt = 0;
for(int i=0; i<n; i++){
nextCanReach = Math.max(nextCanReach, nums[i]+i);
if(i>=curReach&&i!=n-1){
cnt++;
curReach = nextCanReach;
}
}
return cnt;
}
- 这里的思想是, 我在当前可以reach的范围内往右走, 不断更新我下一跳的范围. 那么我从当前范围跳到下一范围的次数是1, 但是具体怎么跳我不管.
- 于是便可以得到一个最优的结果, 因为实际我只需要考虑最远能跳到哪里即可