跳跃游戏II
原来我自己的解法是:
利用最优子结构:到最后一个点步数最少的路径设为a1–ak,如果a1–ak的步数最少,那么a1–ak-1的步数也最少。
a[i]代表起点到下标为i的点的最小路径
a[i]=min{1+a[j]} ,j指i节点之前所有可以直接到达i的节点
class Solution {
public int jump(int[] nums) {
int n=nums.length;
int[] a=new int[n];
a[0]=0;
for(int i=1;i<n;i++) a[i]=99999999;
for(int i=1;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(nums[j]>=i-j&&a[j]+1<=a[i])
{
a[i]=a[j]+1;
}
}
}
return a[n-1];
}
}
复杂度为O(n^2)
最后一个例子老是超时。
下面是贪心法:
`class Solution {
public int jump(int[] nums) {
if(nums.length == 1) return 0;
int reach = 0;
int nextreach = nums[0];
int step = 0;
for(int i = 0;i<nums.length;i++){
nextreach = Math.max(i+nums[i],nextreach);
if(nextreach >= nums.length-1) return (step+1);
if(i == reach){
step++;
reach = nextreach;
}
}
return step;
}
}
//转自leetcode优秀评论,侵删
贪心准则是:在这一步的所有能到达的距离内,下一步能到达的最远距离
我看了好久才懂。