【面试经典150 | 数组】跳跃游戏 II

2023-09-22 10:43:40

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【贪心】【数组】


题目来源

面试经典150 | 45. 跳跃游戏 II


题目解读

给你一个长度为 n 的数组 numsnums[i] 表示你可以从下标 i 往后(往索引变大的方向)跳跃的最大长度,你可以向后跳跃任何距离(该距离在 0nums[i] 内)。返回到达 nums[n-1] 的最小跳跃步数。

题目要求我们求出从位置 0 开始到数组位置 n-1 处跳跃的最小步数。


解题思路

方法一:贪心

我们使用贪心的思想进行解答,贪心的思想即通过局部最优解得到全局最优解。

我们在每次可以跳跃的步数中,选择可以到达最远位置的位置作为起跳点进行跳跃。

例如,对于数组 nums = [2, 1, 3, 4],我们初始位置从下标 0 开始跳跃,可以跳跃到下标 1 和下标 2,其中下标 1 的值为 1,下标 2 的值为 3,因此第一次到达的下标我们选择到达 2

在具体的实现中,我们维护当前能够到达的最大下标位置,记为边界 end。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加 1

在遍历数组时,我们不访问最后一个元素,这是因为在访问最后一个元素之前,我们的边界一定大于等于最后一个位置,否则就无法跳到最后一个位置了。如果访问最后一个元素,在边界正好为最后一个位置的情况下,我们会增加一次不必要的跳跃次数,因此我们不必访问最后一个元素。

以上两端文字出自于 官方题解,还需好好体会。

实现代码

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


复杂度分析

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)


写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

更多推荐

【Java 基础篇】Java网络编程基础知识详解

网络编程是现代软件开发中不可或缺的一部分,它使我们能够在不同的计算机之间实现数据传输和通信。Java作为一种强大的编程语言,提供了丰富的网络编程库,使开发者能够轻松地创建网络应用程序。本文将介绍Java网络编程的基础知识,面向初学者,详细讨论网络通信的概念、Socket编程、服务器和客户端编程等内容。1.网络通信的基本

二刷力扣--栈和队列

栈和队列栈和队列基础(Python)栈一种先进后出,队列先进后出。Python中可以用list实现栈,用append()模拟入栈,用pop()模拟出栈。也可以用list实现队列,但是效率较低,一般用collections.deque模拟(双端)队列。5.数据结构—Python3.11.5文档使用list进行栈的操作st

git 命令总结

git初始化gitinit添加文件gitadd<file>添加注释gitcommit-m"注释"重新提交覆盖上一次提交内容gitcommit--amend查看当前所处状态gitstatus克隆仓库gitclone<remoteURL>关联远程仓库gitremoteadd<remote><remoteURL>查看git对

【Java 基础篇】Java TCP通信详解

TCP(TransmissionControlProtocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。TCP通信适用于对数据传输的可靠性和完整性要求较高的场景,如文件传输、网页浏览等。本文将详细介绍Java中如何使用TCP协议进行网络通信,包括TCP套接字、服务器和客户端的创建、数

麒麟信安的2023世界计算大会时刻

9月15至16日,由工业和信息化部、湖南省人民政府主办的2023世界计算大会在长沙隆重举行。麒麟信安连续五年亮相世界计算大会,本届大会麒麟信安作为计算产业的重要建设者、国家新一代自主安全计算系统产业集群内核心企业,在展览展示、主题演讲、工控操作系统创新研究院揭牌仪式等多环节中深度参与。大会以“计算万物湘约未来——计算产

Leetcode算法入门与数组丨3. 数组基础

文章目录前言1数组简介2数组的基本操作2.1访问元素2.2查找元素2.3插入元素2.4改变元素2.5删除元素3总结task03task04前言Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记这篇博客是一个入门型的文章,主要是自己学习的一个记录。内容会参考这篇笔记(很详细):LeetCode算法笔

Python中的3D矩阵操作

迷途小书童读完需要6分钟速读仅需2分钟3D矩阵又称为立体矩阵,是指一个具有三个维度的矩阵结构。相比二维矩阵,它增加了一个深度维度。在3D矩阵中,第一个维度表示行数,第二个维度表示列数,第三个维度表示层数或深度,可以想象成一个多层的立方体结构。三维矩阵通常也称为NxNxN矩阵,在计算机视觉、医学成像、深度学习、增强现实等

Unity使用Mirror制作局域网的同步

1.脚本布置.参考tank那个demo制作1.新建空物体,为管理脚本的物体:manager,挂载NetworkManager,kcpTransport,NetworkManagerHud.2.设置玩家出生点,spawnPoint,设置好初始化的position的位置(*),挂载NetworkStartPosition的

Cortex-M3/M4基础

一、Cortex-M3/M4通用寄存器1、我们首先来了解一下M3/M4的寄存器,M4比M3多了一个浮点单元FPU。其他的部分基本和M3是一样的。2、Cortex-M3/M4系列处理器拥有通用寄存器R0-R15以及一些特殊功能的寄存器。3、R0‐R12是最“通用目的”的。4、但是绝大多数的16位指令只能使用R0‐R7(低

学习JVM调优

学习JVM调优是为了优化Java应用程序的性能和资源利用。本文将从以下几个方面详细介绍学习JVM调优的步骤和技巧,帮助读者更好地理解和应用这些调优技术。第一部分:理解JVM在学习JVM调优之前,我们需要先理解JVM的工作原理和内部机制。Java虚拟机是Java程序运行的环境,它负责将Java字节码转换为机器代码并运行。

docker学习:dockerfile和docker-compose

学习如何使用dockerfile以下内容,部分来自gpt生成,里面的描述可能会出现问题,但代码部分,我都会进行测试。1.需求对于一个docker,例如python,我们需要其在构建成容器时,就有np。有以下两种方法:pullpython,并run后,在里面pipinstallnumpy,随后对这个容器进行打包保存在pu

热文推荐