leetcode 55&&45 Jump Game 跳跃游戏(贪心)

版权声明:转载请声明文章出处和链接 https://blog.csdn.net/yysave/article/details/84345188

一、

思路:

这个题中等难度,只是问能不能调到最后的位置

需要维护的是当前能够跳的最远的地方

class Solution {
    public boolean canJump(int[] nums) {
        int max_index=0;
        int length=nums.length-1;
        for(int i=0;i<nums.length;i++){
            if(i>max_index||max_index>=length)
                break;
            max_index=Math.max(max_index,i+nums[i]);
           
        }
        return max_index>=length;
    }
}

二、

题目描述和分析:

这个hard难度,问的是最小步数(也就是问的跳到最后的最小步数,可以假设始终可以到达最后的位置)

分析:

其实这个问题不是很好理解,对于我来说是这样的。

要说第一个跳跃问题,只是判断能不能跳到最后,那我只用知道每一个位置能最远跳到哪里,和我当前最大max_index比较一下就可以了。

现在这个第二个问题,默认都能够跳到最后,但是问怎么样步数最小。

这个是看别人的实现,刚开始看着不是很容易理解

// Time Complexity: O(n). Space: O(1).
	public int jump(int[] nums) {
		if (nums == null || nums.length == 0) {
			return -1;
		}
		// cur是维护的当前能跳到的最大位置
		// 第step+1步,能到达的最远距离
		int cur = 0;
		// last是指从之前的点能reach到得最远位置
		// 已经可以到达的最大距离
		int last = 0;
		int step = 0;
		for (int i = 0; i < nums.length/* && i <= cur */; i++) {
			// 当i 大于之前点能碰到的最大位置时,就需要跳一步,
			// 并把last更新为cur.
			if (i > last) {
				step++;
				last = cur;
			}
			// 计算step+1的最大距离
			cur = Math.max(cur, nums[i] + i);
		}
		// 最后返回若是cur能到最后一个元素,就返回step,
		// 若是到不了,就说明根本走不到最后一步,返回-1.
		return cur < nums.length - 1 ? -1 : step;
	}

但是我做了一点改进,让看着更明白

class Solution {
    public int jump(int[] nums) {
        int length=nums.length;
        if(nums==null||length==0)
            return -1;
        int cur_maxIndex=0;
        int last_maxIndex=0;
        int min_jump=0;
        for(int i=0;i<length;i++){
            if(last_maxIndex>=length-1)
                break;
            if(i>last_maxIndex){
                min_jump++;
                last_maxIndex=cur_maxIndex;
            }
            cur_maxIndex=Math.max(cur_maxIndex,nums[i]+i);
        }
        return min_jump;
    }
}

改进之后,原先是6ms,现在是5ms了。然后我们来分析一下这个时候,就比较好理解了,就是说last_maxIndex其实是上一步能够到达的最远距离,cur_maxIndex是当前能够到达的最远距离
 

猜你喜欢

转载自blog.csdn.net/yysave/article/details/84345188