算法——Week16

55. Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
jump length is 0, which makes it impossible to reach the last index.


解题思路
这道题目其实关键在于0 。没有出现0,则一定返回true。出现了0,如ex1,之前所有位置都不能跳过0,那一定返回flase。题目就化简为,判断0之前的所有数,到0的距离和数值比大小。


代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size() <= 1) {
            return true;
        }
        if(nums[0] == 0) {
            return false;
        }
        vector<int> zerostep;
        for(int i = 0; i < nums.size() - 1; i++) {
            if(nums[i] == 0) {
                zerostep.push_back(i);
            }
        }
        if(zerostep.size() == 0) {
            return true;
        }
        vector<int> tag(zerostep.size(), 0);
        for(int k = 0; k < zerostep.size(); k++) {
            for(int i = 0; i < zerostep[k]; i++) {
                if(nums[i] > zerostep[k] - i) {
                    tag[k] = 1;
                    break;
                }
            }
            if(tag[k] == 0){
                return false;
            }
        }
        return true;
    }
};

基于另一种思路,从第一个位置开始遍历,并记录可以到达的最远的距离(可以大于数组长度),直到当前位置不可达或者到达最后一个位置。判断当前位置是否为最后一个位置,是则返回真,否则返回假。
代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int len = nums.size();
        if(len == 1) {
            return true;
        }
        int i = 0;
        for(int reach = 0; i < len && i <= reach; i++) {
            reach = max(i + nums[i], reach);
        }
        return i == len;
    }
};

猜你喜欢

转载自blog.csdn.net/melwx/article/details/85335742