列表

详情


NC197. 跳跃游戏(一)

描述

给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。如果能够跳到数组最后一个位置,则返回true,否则返回false。
数据范围:


示例1

输入:

[2,1,3,3,0,0,100]

输出:

true

说明:

首先位于nums[0]=2,然后可以跳2步,到nums[2]=3的位置,再跳到nums[3]=3的位置,再直接跳到nums[6]=100,可以跳到最后,返回true

示例2

输入:

[2,1,3,2,0,0,100]

输出:

false

说明:

无论怎么样,都跳不到nums[6]=100的位置

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 33ms, 内存消耗: 6508KB, 提交时间: 2021-12-04

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool canJump(vector<int>& nums) {
        // write code here
        int len=nums.size();
        if(len==1)
            return true;
        int tmp=nums[0];
        for(int i=0;i<=tmp;i++){
            tmp=max(tmp,i+nums[i]);
            if(tmp>=len-1)
                return true;
        }
        return false;
    }
};

C++ 解法, 执行用时: 33ms, 内存消耗: 6520KB, 提交时间: 2022-01-29

class Solution {
public:
    /*
    方法一:贪心
    
    解题思路:
    1. 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点
    2. 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新
    3. 如果可以一直跳到最后,就成功了

    复杂度分析
    时间复杂度:O(n)
    空间复杂度:O(1)

    参考:
    https://leetcode-cn.com/problems/jump-game/solution/55-by-ikaruga/
    */
    bool canJump1(vector<int>& nums) {
        if (nums.size() == 0) {
            return false;
        }
        //前n-1个元素能够跳到的最远距离
        int k = 0;
        for (int i = 0; i <= k; i++) {
            //第i个元素能够跳到的最远距离
            int temp = i + nums[i];
            //更新最远距离
            k = max(k, temp);
            //如果最远距离已经大于或等于最后一个元素的下标,则说明能跳过去,退出. 减少循环
            if (k >= nums.size() - 1) {
                return true;
            }
        }
        //最远距离k不再改变,且没有到末尾元素
        return false;
    }

    //方法一代码精简版本
    bool canJump1_2(vector<int>& nums) {
        int k = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (i > k) return false;
            k = max(k, i + nums[i]);
        }
        return true;
    }

    /*
    方法一,另一种写法

    【性质】如果能够到达当前位置,那么也就一定能够到达当前位置的左边所有位置
    */
    bool canJump1_3(vector<int>& nums) {
        int k = 0; //k为当前能够到达的最大位置
        for(int i = 0; i < nums.size(); i++){
            if(i > k) return false;//【关键】遍历元素位置下标大于当前能够到达的最大位置下标,不能到达
            //能够到达当前位置,看是否更新能够到达的最大位置k
            k = max(k, i + nums[i]);
        }
        //跳出则表明能够到达最大位置
        return true;
    }

    /*
    方法一,另一种实现
    每一步都计算一下从当前位置最远能够跳到哪里,然后和一个全局最优的最远位置 farthest 做对比,
    通过每一步的最优解,更新全局最优解,这就是贪心。

    参考:
    https://labuladong.gitee.io/algo/3/27/107/
    */
    bool canJump(vector<int>& nums) {
        int n = nums.size();
        int farthest = 0;
        for (int i = 0; i < n - 1; i++) {
            // 不断计算能跳到的最远距离
            farthest = max(farthest, i + nums[i]);
            // 可能碰到了 0,卡住跳不动了
            if (farthest <= i) {
                return false;
            }
        }
        return farthest >= n - 1;
    }

    /*
    方法二:动态规划(超时)
    */
    bool canJump2(vector<int>& nums) {
        int n = nums.size();
        vector<bool> F(n, 0);
        //初值条件
        F[0] = true;
        //递推方程
        for(int k = 1; k < n; k++) {
            for(int j = 0; j < k; j++) {
                if(F[j] == true && k - j <= nums[j]) {//【易错】nums[j]为可以跳跃的最大长度
                    F[k] = true;
                    break;
                }
            }
        }
        return F[n - 1];
    }
};

C++ 解法, 执行用时: 34ms, 内存消耗: 6412KB, 提交时间: 2022-02-08

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool canJump(vector<int>& nums)
    {
        int len = nums.size();
        int temp = 0;
        
        for(int i=0; i<len; ++i)
        {
            if(i > temp) return false;
            temp = max(temp, i + nums[i]);
            if(temp >=len-1)
                return true;
        }

        return false;
    }
};

C++ 解法, 执行用时: 34ms, 内存消耗: 6508KB, 提交时间: 2021-11-29

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool canJump(vector<int>& nums) {
        // write code here
        
        if(nums.size()==1)return true;
         
        int tmp=nums[0];
        for(int i=1;i<=tmp;i++){
             
            tmp=max(tmp,i+nums[i]);
             
            if(tmp>=nums.size()-1)return true;
        }
         
        return false;
        
        
    }
};

C++ 解法, 执行用时: 34ms, 内存消耗: 6508KB, 提交时间: 2021-11-18

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return bool布尔型
     */
    bool canJump(vector<int>& nums) {
        // write code here
        if(nums.size() < 2) return true;
        int jump = 0;
        for(int i = 0; i <= jump; i++)
        {
            jump = max(jump, i + nums[i]);
            if(jump >= nums.size() - 1) return true;
        }
        return false;
    }
};

上一题