力扣 —— 跳跃游戏

news/2024/10/4 1:14:24 标签: leetcode, 游戏, 算法, 力扣

题目一(中等)

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104

题目思路

从终点向前遍历,一开始的 target 设置为 n - 1, 遍历指针 i 设置为 n - 2,当 i 遍历过起点(index 为 0)后遍历结束。if (i + nums[i] >= target) target = i 这个判断的含义是,如果从当前位置跳跃最大长度可以到达此时的 target,那么我们就把 target 更新为此时的 i (因为如果到达此时的 i , 就可以到达原本的 target,如此循环,一定可以到达一开始的 target 也就是最后一个下标 n - 1),然后 i-- 向前遍历,重复这个过程直到循环结束。 最后判断 if target == 0 ,说明从起始点开始一定有一个策略可以一直跳到最后一个下标,返回 true,否则说明不存在这样的策略,返回 false,游戏结束。

答案

class Solution {
    public boolean canJump(int[] nums) {
        int target = nums.length -1;
        int i = target -1; 
        while(i >= 0){
            if(i + nums[i] >= target){
                target = i;
            }
            i--;
        }
        return target == 0 ; 
    }
}

题目二(中等)

给定一个长度为 n0 索引整数数组 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

提示:

  • 1 <= prices.length <= 105
  • 0 <= prices[i] <= 104
  • 题目保证可以到达 nums[n-1]

题目思路

贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!

在这里插入图片描述

答案

class Solution {
    public int jump(int[] nums) {
          if (nums == null || nums.length == 0 || nums.length == 1) {
            return 0;
        }
        //记录跳跃的次数
        int count=0;
        //当前的覆盖最大区域
        int curDistance = 0;
        //最大的覆盖区域
        int maxDistance = 0;
        for (int i = 0; i < nums.length; i++) {
            //在可覆盖区域内更新最大的覆盖区域
            maxDistance = Math.max(maxDistance,i+nums[i]);
            //说明当前一步,再跳一步就到达了末尾
            if (maxDistance>=nums.length-1){
                count++;
                break;
            }
            //走到当前覆盖的最大区域时,更新下一步可达的最大区域
            if (i==curDistance){
                curDistance = maxDistance;
                count++;
            }
        }
        return count;
    }
}

http://www.niftyadmin.cn/n/5689234.html

相关文章

latex有哪些颜色中文叫什么,Python绘制出来

latex有哪些颜色中文叫什么&#xff0c;Python绘制出来 为了展示xcolor包预定义的颜色及其对应的中文名称&#xff0c;并使用Python打印出来&#xff0c;我们可以先列出常见的预定义颜色名称&#xff0c;然后将它们翻译成中文&#xff0c;并最后用Python打印出来。 步骤 列出…

Redis入门第四步:Redis发布与订阅

欢迎继续跟随《Redis新手指南&#xff1a;从入门到精通》专栏的步伐&#xff01;在本文中&#xff0c;我们将深入探讨Redis的发布与订阅&#xff08;Pub/Sub&#xff09;模式。这是一种强大的消息传递机制&#xff0c;适用于各种实时通信场景&#xff0c;如聊天应用、实时通知和…

【算法与图】通向高效解决方案的钥匙

文章目录 遍历算法BFS&#xff08;广度优先遍历&#xff09;1. 什么是 BFS&#xff1f;2. 特点和应用3. BFS 示例 DFS&#xff08;深度优先搜索&#xff09;1. 什么是 DFS&#xff1f;2. DFS 的基本步骤3. 特点4. DFS 的应用5. DFS 示例 最小生成树问题1. 什么是最小生成树&…

【AI知识点】交叉注意力机制(Cross-Attention Mechanism)

交叉注意力机制&#xff08;Cross-Attention Mechanism&#xff09; 是一种在深度学习中广泛使用的技术&#xff0c;尤其在序列到序列&#xff08;sequence-to-sequence&#xff09;模型和Transformer 模型中被大量应用。它主要用于不同输入之间的信息交互&#xff0c;使模型能…

Docker 启动 PostgreSQL 主从架构:实现数据同步的高效部署指南

Docker 启动 PostgreSQL 主从架构&#xff1a;实现数据同步的高效部署指南 文章目录 Docker 启动 PostgreSQL 主从架构&#xff1a;实现数据同步的高效部署指南一 主从地址二 创建db网络三 docker compose 文件四 部署主库五 部署从库六 查看进程七 测试同步 本文详细介绍了如何…

MongoDB 的基本使用

目录 数据库的创建和删除 创建数据库 查看数据库 删除数据库 集合的创建和删除 显示创建 查看 删除集合 隐式创建 文档的插入和查询 单个文档的插入 insertOne insertMany 查询 嵌入式文档 查询数组 查询数组元素 为数组元素指定多个条件 通过对数组元素使…

实用技能分享!推荐最适合论文写作的5款ai工具

在当今学术研究和教育领域&#xff0c;AI工具的应用已经变得越来越普遍。这些工具不仅能够提高写作效率&#xff0c;还能帮助生成高质量的文稿。对于教师而言&#xff0c;选择合适的AI工具可以显著提升论文写作的效率和质量。本文将重点推荐五款最适合教师论文写作的AI工具&…

大功率LED模块(5V STM32)

目录 一、介绍 二、模块原理 1.尺寸介绍 2.模块原理图 3.引脚描述 三、程序设计 main.c文件 timer.h文件 timer.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 大功率LED模块是一种照明设备&#xff0c;它将大功率高亮度发光二极管(LED)集成在铝基板上&…