100道面试必会算法-34-跳跃游戏 && 跳跃游戏

100道面试必会算法-34-跳跃游戏 | && 跳跃游戏||

给定一个长度为 n 的 0 索引 整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例 1:

复制代码
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

复制代码
输入: nums = [2,3,0,1,4]
输出: 2

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

问题描述

跳跃游戏是一个经典的算法问题,给定一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。目标是使用最少的跳跃次数到达数组的最后一个位置。

算法思路

给定数组 nums,从起始位置开始,以贪心的策略选择每一步能够跳跃的最远距离,直到到达数组的末尾。具体步骤如下:

  1. 初始化起始位置 start 为 0,结束位置 end 为 1,跳跃次数 count 为 0。
  2. 在循环中,不断更新当前能够跳跃到的最远位置 maxpos。
  3. 遍历从 start 到 end 之间的元素,找到能够跳跃到的最远位置。
  4. 更新起始位置 start 为当前结束位置 end,更新结束位置 end 为下一次能够跳跃到的最远位置 maxpos + 1。
  5. 每次循环增加跳跃次数 count。
  6. 循环直到结束位置 end 超过数组长度。

算法分析

  • 时间复杂度:O(n),其中 n 为数组的长度,因为在每个位置只需要遍历一次。
  • 空间复杂度:O(1),只需要常数级别的额外空间。

代码实现

java 复制代码
class Solution {
    // 定义一个方法,计算跳跃次数
    public int jump(int[] nums) {
        int start = 0; // 起始位置
        int end = 1; // 结束位置
        int count = 0; // 跳跃次数

        // 循环直到达到最后一个位置
        while (end < nums.length) {
            int maxpos = 0; // 最大跳跃位置
            // 遍历当前范围内的数字,找到能跳到的最远位置
            for (int i = start; i < end; i++) {
                maxpos = Math.max(maxpos, i + nums[i]);
            }
            start = end; // 更新起始位置为当前结束位置
            end = maxpos + 1; // 更新结束位置为下一次能跳到的最远位置
            count++; // 增加跳跃次数
        }
        return count; // 返回跳跃次数
    }
}

示例 1:

复制代码
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

复制代码
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
解题思路:
  1. 如果某一个作为 起跳点 的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以作为 起跳点

  2. 可以对每一个能作为 起跳点 的格子都尝试跳一次,把 能跳到最远的距离 不断更新

  3. 如果可以一直跳到最后,就成功了

    k是道路,i是人的位置,只要道路不断延伸,就能走到终点

java 复制代码
class Solution {
    public boolean canJump(int[] nums) {
        int k=0; // 当前能够到达的最远位置
        for(int i=0;i<nums.length;i++){
            if(k<i) return false; // 如果当前位置超过了能够到达的最远距离,则无法到达终点
            k=Math.max(k,i+nums[i]); // 更新能够到达的最远位置
        }
        return true; // 循环结束后仍未返回false,则可以到达终点
    }
}
相关推荐
BYSJMG1 小时前
计算机毕业设计选题推荐:基于大数据的快递物流运营数据分析与可视化,Spark与K-Means
大数据·算法·数据分析·spark·课程设计
怕浪猫1 小时前
分享一个做视频的skill,这条白板视频,每一笔都是代码画的
前端·javascript·面试
阳明山水2 小时前
因果一致性正则化实战解析
人工智能·深度学习·算法·机器学习·架构
黄金龙PLUS3 小时前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
心中有你02143 小时前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
弈栈录3 小时前
基于 Spring Boot 构建生产级 AI 应用平台
后端·面试·架构
Omics Pro4 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
Moment6 小时前
如果你在做 RAG,可能会需要 pdf-inspector
前端·后端·面试
UIU1146 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
卷福同学12 小时前
第一次当面试官有感
后端·面试