leetcod第四十五题Java解法——跳跃游戏 II

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

假设你总是可以到达数组的最后一个位置。

思路:用cur来记录当前所能跳到最远的地方,m用来表示上一步所能跳到的最远处,根据m来遍历数组并更新cur的值,直到cur可以到达最后一个位置。

class Solution {
    public int jump(int[] nums) {
        int cur=nums[0],res=0,m=0,i=0; 
        if(nums.length==1)
           return 0;
        while(cur<nums.length-1)//当cur=nums.length时说明已经到达末尾,所以减一
        {
            m=cur;
            for(;i<=m;i++)//i初值放外面
            { 
                cur=Math.max(i+nums[i],cur);//i+nums[i]代表下标为i的哪一处的跳力
                //指从当前位置可以跳到何处,
            }
            res++;
        }
        return res+1;//举个例子[2,3,1,1,4]因为从3到最后这一步使得cur=length
        //所以不能算,只能加一
     }
 } 

和上面写法类似,稍加变换

class Solution {
    public int jump(int[] nums) {
	 int cur=0,i=0,res=0,pre=0;//cur初值为0
        while(cur<nums.length-1)
        {
            res++;
            pre=cur;
            for(;i<=pre;i++)
            {
                cur=Math.max(i+nums[i],cur);//将数组第一个数赋给cur,并让res加了一
                //所以和缺失的最后一步补充上了,所以返回res
            }
        }
        return res;
    }
}

你可能感兴趣的:(leetcode)