【中等】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.

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

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

判断你是否能够到达最后一个位置。

Example1

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

Example2

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

来源:力扣(LeetCode)
链接:https://leetcode.com/problems/jump-game

解法

解题思路

拿到题第一反应是傻瓜式使用动态规划,创立了一个nums.size()的bool数组,然后逐渐找到所有位置是否可以走到,发现是我愚蠢了,这样的问题在于重复做了很多无用功,有一些已经是true的位置会被重复赋值。

这时候分析发现,其实只要从第一步开始找到最远可以走到哪里就行了,对每个位置都更新能到的最远距离,如果当前遍历的位置已经超过了能到达的最远距离,那就可以说明无法到达最后一步了,直到如果最远如果可以到最后一步就返回true,不可以就false

代码

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

总结

一开始提交的是while的版本,运行起来比for会慢一些

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int max = 0, step = 0;
        while(step < max+1){
            max = max < step+nums[step] ? step+nums[step] : max;
            if(max >= nums.size()-1) return true;
            step++;
        }
        return false;
    }
};
posted @ 2020-04-17 11:00  陌良  阅读(130)  评论(0编辑  收藏  举报