列表

详情


NC148. 几步可以从头跳到尾

描述

给你一个长度为 n 的数组 a
ai 表示从 i 这个位置开始最多能往后跳多少格。
求从 1 开始最少需要跳几次就能到达第 n 个格子。

数据范围:
进阶: 空间复杂度 , 时间复杂度

示例1

输入:

2,[1,2]

输出:

1

说明:

从1号格子只需要跳跃一次就能到达2号格子

示例2

输入:

3,[2,3,1]

输出:

1

说明:

从1号格子只需要跳一次就能直接抵达3号格子

原站题解

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

C++ 解法, 执行用时: 19ms, 内存消耗: 3256KB, 提交时间: 2021-07-24

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最少需要跳跃几次能跳到末尾
     * @param n int整型 数组A的长度
     * @param A int整型vector 数组A
     * @return int整型
     */
    int Jump(int n, vector<int>& A) {
        // write code here
        int maxdis = 0, cur = 0, res = 0;
        for (int i = 0; i < n - 1 && cur < n; i++) {
            maxdis = max(maxdis, i + A[i]);
            if (cur == i) {
                cur = maxdis;
                res++;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 3200KB, 提交时间: 2021-07-31

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最少需要跳跃几次能跳到末尾
     * @param n int整型 数组A的长度
     * @param A int整型vector 数组A
     * @return int整型
     */
    const int INF = 0x3F3F3F3F;
    
    int Jump(int n, vector<int>& A) {
        // write code here
        int res = 0;
        
        int reach = A.size() - 1;
        while(reach != 0){
            for (int i = 0; i < reach; i++) {
               // 从左(i递增)至右查找到第一个(离终点最远, 贪就贪在这里)能跳至终点的落脚处
               if (i + A[i] >= reach) {
                   // 更新终点
                   reach = i;
                   res++;
               }
           }
        }
        
        return res;
    }
};

C++ 解法, 执行用时: 20ms, 内存消耗: 3808KB, 提交时间: 2021-08-02

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最少需要跳跃几次能跳到末尾
     * @param n int整型 数组A的长度
     * @param A int整型vector 数组A
     * @return int整型
     */
    int Jump(int n, vector<int>& A) {
        int reach = n - 1;
        int res = 0;
        while (reach) {
            for (int i = 0; i < reach; i++) {
                if (i + A[i] >= reach) {
                    reach = i;
                    res++;
                }
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 3268KB, 提交时间: 2021-07-27

class Solution {
public:
    int Jump(int n, vector<int>& A) {
        int step=0;//最大跳跃次数
        int len=A.size();
        int end=0,res=0;//分别表示结束位置已经跳跃次数
        for(int i=0;i<len-1;i++)
        {
            step=max(step,i+A[i]);
            if(end>=n) break;
            if(end==i)
            {
                end = step;
                res++;
            }
        }
        return res;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 3812KB, 提交时间: 2021-07-29

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 最少需要跳跃几次能跳到末尾
     * @param n int整型 数组A的长度
     * @param A int整型vector 数组A
     * @return int整型
     */
    int Jump(int n, vector<int>& A) {
        // write code here
        int cnt = 0;
        int index = 0;
        int maxstep = 0;
        for(int i = 0; i < n; i++){
            maxstep = max(maxstep, i + A[i]);
            if(index == i){
                index = maxstep;
                cnt++;
            }
            if(index >= n - 1) break;
        }
        return cnt;
    }
};

上一题