LeetCode算法题55:跳跃游戏解析

给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

这个题看不仔细可能会误解,不是一定要跳跃最大长度的,可以跳跃长度小于最大长度,只要最后能够到达最后就可以,超过最后一个位置也是可以的。所以使用贪婪算法,计算每一步能到达的最远位置,然后记录替换,如果发现当前位置大于最大位置,说明遇到了0,这种情况一定到不了最后,另外如果已经超过了最后位置,那么也是可以停止计算了。
C++源代码:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        int far = 0;
        for (int i=0;i<n;i++)
        {
            if (i>far || far>=n-1) break;
            far = max(far, i+nums[i]);
        }
        return far >= n-1;
    }
};

python3源代码:

class Solution:
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        n = len(nums)
        far = 0
        for i in range(n):
            if i>far or far>=n-1:
                break
            far = max(far, i+nums[i])
        return far >= n-1

你可能感兴趣的:(Leetcode算法题分析)