【LeetCode刷题记录】45.跳跃游戏 II

news/2024/10/9 3:22:57 标签: leetcode, 算法, 贪心算法

45 跳跃游戏 II

给定一个长度为 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

提示:
1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
0 < = n u m s [ i ] < = 1000 0 <= nums[i] <= 1000 0<=nums[i]<=1000
题目保证可以到达 nums[n-1]

思路

法一:
可反向查找。从最后一个位置之前的元素判断能否跳跃到达,如果能到达在往前查找这个元素之前的位置能否跳跃到达。但是由于要计算最小跳跃次数,故需要贪心选择距离末位置最远的元素,可以从左到右遍历。
比如说:1,2,1,1,1
pos=4,我们先判断倒数第2个位置的1能否到达最末位置即i+nums[i]>=pos,3+nums[3]>=pos,发现可以,步数cnt+1,往前遍历,此时i=3,pos=i,正向遍历发现2+nums[2]>=3,步数cnt+1,再往前遍历,pos=2,可以找到1+nums[1]>=2,cnt+1,最终得到cnt=3

法二:
正向查找。从左到右遍历,每次遍历计算当前可到达的最大长度。在这个最大长度里,选择下一个节点可到达最大长度,以此类推。

代码

法一:

class Solution {
public:
    int jump(vector<int>& nums) {
        int pos = nums.size() - 1;
        int cnt = 0;
        while (pos > 0) {
            for (int i = 0; i < pos; i++) {
                // 这里已经判断了是否能到达下一个位置
                if (i + nums[i] >= pos) {
                    // 往前推
                    pos = i;
                    cnt++;
                    break;
                }
            }
        }
        return cnt;
    }
};

法二:

class Solution {
public:
    int jump(vector<int>& nums) {
        int maxPos = 0;
        int n = nums.size();
        int cnt = 0, end = 0;
        for (int i = 0; i < n-1; i++) {
            if (i <= maxPos) {
                maxPos = max(maxPos, i + nums[i]);
                if (i == end) {
                    end = maxPos;
                    cnt++;
                }
            }
        }
        return cnt;
    }
};

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

相关文章

ROS理论与实践学习笔记——2 ROS通信机制之常用API

"API" 是 "Application Programming Interface" 的缩写&#xff0c;指的是应用程序编程接口。API是一组定义了不同软件组件如何互相通信的规范。它允许不同的软件系统之间共享功能&#xff0c;提供一种标准的方式来访问某个软件组件的功能或数据。 详细内…

逼近理论及应用精解【6】

文章目录 决策树基础决策树的定义决策树的计算决策树的例子决策树的例题 决策树算法一、决策树的算法过程二、决策树的性质 Julia中实现框架使用 DecisionTree.jl使用 MLJ.jl Julia包的教程一、了解Julia包生态系统二、安装Julia包1. 打开Julia REPL2. 使用Pkg包管理器 三、使用…

在 JavaScript 中使用 window 对象来刷新页面

在 JavaScript 中&#xff0c;你可以使用 window 对象提供的 location 属性或 reload 方法来刷新页面。以下是两种常用的方法&#xff1a; 使用 location.reload() location.reload() 方法是最直接和常用的方式来刷新当前页面。它有两个可选的布尔参数&#xff0c;但通常不需…

有哪些工具可以辅助特定方法来提升DFT ATPG的coverage?

以下是一些可以辅助提升DFT ATPG覆盖率的工具: 一、综合与布局布线工具相关功能 Synopsys Design Compiler(综合工具) 功能: 在综合过程中,它可以对设计进行优化,以便于更好地进行DFT插入。例如,它能够识别和保留关键的测试结构,确保在综合后的网表中,扫描链等DFT结构…

【Docker从入门到进阶】01.介绍 02.基础使用

1. 介绍 1.1. 什么是 Docker Docker 是一个开源的平台&#xff0c;用于开发、发布和运行应用程序。它使开发者能够以更精简的方式封装应用及其依赖&#xff0c;做到“打包一次&#xff0c;到处运行”。通过 Docker&#xff0c;您可以创建轻量级、可移植的容器&#xff0c;每个…

对话框资源

优化登录框&#xff1a; 当用户点击取消按钮&#xff0c;弹出问题对话框&#xff0c;询问是否要确定退出登录&#xff0c;并提供两个按钮&#xff0c;yes|No&#xff0c;如果用户点击的Yes&#xff0c;则关闭对话框&#xff0c;如果用户点击的No&#xff0c;则继续登录 当用户点…

Docker 安装 Citus 单节点集群:全面指南与详细操作

Docker 安装 Citus 单节点集群&#xff1a;全面指南与详细操作 文章目录 Docker 安装 Citus 单节点集群&#xff1a;全面指南与详细操作一 服务器资源二 部署图三 安装部署1 创建网络2 运行脚本1&#xff09;docker-compose.cituscd1.yml2&#xff09;docker-compose.cituswk1.…

报错笔记

报错笔记 若依报错若依跳转新页面&#xff0c;同时关闭当前页面 element UI组件使用报错使用element UI Table 高亮显示某一行 若依报错 若依跳转新页面&#xff0c;同时关闭当前页面 使用场景如&#xff1a;当在新增/编辑路由页面提交成功后&#xff0c;需要关闭当前页&#…