Python面试宝典第16题:跳跃游戏

题目

        给你一个非负整数数组 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,所以永远不可能到达最后一个下标。

动态规划法

        使用动态规划法求解本题的基本思路为:从数组的末尾开始向前计算,看是否能够从某个位置跳到最终位置。具体而言,我们定义一个布尔型数组dp,其中dp[i]表示是否可以从位置 i 跳跃到达数组的最后一个位置。根据题目要求,我们的目标是确定dp[0]是否为True。使用动态规划法求解本题的主要步骤如下。

        1、初始化。由于最后一个位置不需要跳跃即可到达,所以 dp[-1] = True。

        2、从后向前遍历。对于数组中的每个位置 i, 从倒数第二个位置开始向前遍历至第一个位置,检查每个位置 i 能否通过它所能到达的下一个位置 j(满足 j + nums[j] >= i)间接到达终点。如果存在这样的 j 且 dp[j] 为 True,则设置 dp[i] = True。

        3、结果判断。遍历完成后,dp[0] 的值即为所求。如果为 True,说明可以从第一个位置跳到最后一个位置,反之则不能。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def jump_game_by_dp(nums):n = len(nums)# 初始化 dp 数组,最后一个位置设为 Truedp = [False] * ndp[n - 1] = True# 从倒数第二个位置开始向前遍历for i in range(n - 2, -1, -1):# 检查当前位置能否通过后续位置跳转到达终点max_reach = min(i + nums[i], n - 1)for j in range(i + 1, max_reach + 1):# 如果后续某个位置可达终点,则当前位置也可达if dp[j]:dp[i] = Truebreakreturn dp[0]nums = [2, 3, 1, 1, 4]
print(jump_game_by_dp(nums))
nums = [3, 2, 1, 0, 4]
print(jump_game_by_dp(nums))

贪心算法

        本题单纯采用贪心算法,并不能求得最优解。但可以采用贪心+最远可达更新算法,其基本思想是:维护一个变量来记录当前能到达的最远位置,然后逐步推进,确保每一步都能保持在“最远可达”范围内,直到覆盖整个数组或发现无法到达更远的地方。使用贪心+最远可达更新算法求解本题的主要步骤如下。

        1、初始化。设置两个变量:maxReach初始化为第一个元素的值,表示当前能跳到的最远位置;curEnd初始化也为第一个元素的值,表示当前遍历的最远边界。

        2、遍历与更新。遍历数组,对于每个位置 i,如果 i 在curEnd之内,尝试更新maxReach为当前位置 i 加上其数值nums[i]和当前maxReach中的较大值。这样,maxReach一直保持为当前位置可达的最远边界。当 i 等于curEnd时,说明已经探索完当前可达区域,此时将curEnd更新为maxReach的值,继续探索。

        3、判断结果。如果在遍历过程中,maxReach能够超过或到达数组的最后一个索引,说明可以到达终点。否则,不能到达。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def jump_game_greedy(nums):n = len(nums)# 初始化最远可达位置和当前边界maxReach = curEnd = 0for i in range(n):# 如果当前位置超过了当前边界,无法继续前进if i > curEnd:return False# 更新最远可达位置maxReach = max(maxReach, i + nums[i])# 当前边界已经达到或超过了最远可达位置,移动边界if i == curEnd:curEnd = maxReach# 如果最远可达位置能够覆盖最后一个元素,说明可以到达终点return Truenums = [2, 3, 1, 1, 4]
print(jump_game_greedy(nums))
nums = [3, 2, 1, 0, 4]
print(jump_game_greedy(nums))

总结

        动态规划法的时间复杂度为O(n^2),实际上并不高效,特别是内部还有一个额外的循环来检查可达性。其空间复杂度为O(n),因为需要一个额外的数组来存储每个位置是否可达的信息。

        贪心+最远可达更新算法的效率较高,因为它避免了重复计算,每次迭代都确保了下一步至少有一个可跳到的位置,并且始终尝试最大化下一步的跳跃范围。其时间复杂度为O(n),每个元素只被访问一次。空间复杂度为O(1),只需要常数级别的额外空间来存储几个变量。

        可以看到,在处理大数据集时,贪心+最远可达更新算法在效率上明显优于动态规划法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/48601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

detection_segmentation

目标检测和实例分割(OBJECT_DETECTION AND INSTANCE SEGMENTATION) 文章目录 目标检测和实例分割(OBJECT_DETECTION AND INSTANCE SEGMENTATION)一. 计算机视觉(AI VISION)1. 图像分类2. 目标检测与定位3. 语义分割和实例分割目标检测算法可以分为两大类: R-CNN生成…

Linux系统:揭开它神秘面纱的科普之旅

在这个数字化时代,电脑和手机成了我们生活中不可或缺的一部分。而提到这些设备的操作系统,大家可能首先想到的是Windows、macOS或是Android。 但你知道吗,在技术的海洋里,还有一个强大而灵活的操作系统家族,它就是Lin…

python-多任务编程

2. 多任务编程 2.1 多任务概述 多任务 即操作系统中可以同时运行多个任务。比如我们可以同时挂着qq,听音乐,同时上网浏览网页。这是我们看得到的任务,在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统,具备…

JVM--HostSpot算法细节实现

1.根节点枚举 定义: 我们以可达性分析算法中从GC Roots 集合找引用链这个操作作为介绍虚拟机高效实现的第一个例 子。固定可作为GC Roots 的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如 栈帧中的本地变量表&a…

时间序列预测方法概述

这里写目录标题 时间序列预测方法概述1.统计方法1.1 ARIMA (AutoRegressive Integrated Moving Average)1.2 State Space Models1.3 Exponential Smoothing 2.机器学习方法2.1 SVM (Support Vector Machines)2.2 RF (Random Forest)2.3 KNN (K-Nearest Neighbors) 3. 深度学习方…

latex \left{ \right} 环境不能自动换行

latex \left{ \right} 环境不能自动换行 1. 问题描述2.解决方法 1. 问题描述 可以看到 V { v 1 , v 2 , . . . , v g } V\left\{v_1, v_2, ..., v_g \right\} V{v1​,v2​,...,vg​}没有自动换行。 2.解决方法 在合适换行的位置加入\right.\\ \left.,手动换行。…

连锁收银系统一定需要具备会员营销功能

连锁收银系统不只是一个收银工具,它需要具备会员营销功能,这取决于连锁店的经营策略和目标群体。会员营销功能通常用于吸引和留住忠实客户,通过积分、折扣、专属优惠等方式提升客户的消费频率和金额。连锁店的经营模式侧重于会员制度或者目标…

Golang | Leetcode Golang题解之第257题二叉树的所有路径

题目: 题解: func binaryTreePaths(root *TreeNode) []string {paths : []string{}if root nil {return paths}nodeQueue : []*TreeNode{}pathQueue : []string{}nodeQueue append(nodeQueue, root)pathQueue append(pathQueue, strconv.Itoa(root.V…

PDF文件压缩怎么弄?这3个方法轻松解决

PDF文件压缩怎么弄?PDF文件压缩在日常办公和学习中扮演着至关重要的角色,它不仅仅是减少文件占用的磁盘空间那么简单,更是提升了文件在云存储、电子邮件发送以及跨设备传输时的效率与便捷性。通过压缩,我们能够更快地共享大型文档…

【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析

初阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!时间与空间复杂度的深度剖析深入解析顺序表:探索底层逻辑深入解析单链表:探索底层逻辑深入解析带头双向循环链表:探索底层逻辑深入解析栈:探索底层逻辑深入解析队列:探索底层逻辑深入解析循环队列:探索…

【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

文章目录 前言⭐✨💫🔥📖一、Celery⭐1.基本概念及介绍:✨2.使用步骤💫 二、订单超时 取消订单(Celery)🔥具体实现流程📖 前言⭐✨💫🔥📖 在构建复…

GIT命令学习 二

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…

开源智能助手平台Dify是什么?

1.背景 对于国内小公司,怎样通过Ai 将内部流程、产品重新做一次,从而提高人效、给客户带来价值,这是老板们在考虑的问题 ? 当前市面上的你大模型例如:通义千问、文心一言、kimi、智谱清言、盘古 等,底层能…

JavaWeb服务器-Tomcat(Tomcat概述、Tomcat的下载、安装与卸载、启动与关闭、常见的问题)

Tomcat概述 Tomcat服务器软件是一个免费的开源的web应用服务器。是Apache软件基金会的一个核心项目。由Apache,Sun和其他一些公司及个人共同开发而成。 由于Tomcat只支持Servlet/JSP少量JavaEE规范,所以是一个开源免费的轻量级Web服务器。 JavaEE规范&…

python-网络并发模型

3. 网络并发模型 3.1 网络并发模型概述 什么是网络并发 在实际工作中,一个服务端程序往往要应对多个客户端同时发起访问的情况。如果让服务端程序能够更好的同时满足更多客户端网络请求的情形,这就是并发网络模型。 循环网络模型问题 循环网络模型只能…

逻辑回归损失函数

文章目录 1.基础简析交叉熵损失函数(Cross-Entropy Loss)对数似然损失函数(Log-Likelihood Loss) 2.关键步骤3.案例 1.基础简析 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计模型&#x…

C++进阶 继承

目录 继承的概念及定义 继承概念 继承定义 定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 析构函数 总结 继承与友元 继承与静态成员 浅谈复杂…

Scott Brinker:消除噪音越来越难?这是一个越来越有效的营销渠道

合作伙伴成为更有效的渠道 对于普通读者来说,我看好生态系统并不奇怪。我一直主张,平台生态系统可以解决不断变化、高度多样化的市场格局中的许多挑战。这也是我在HubSpot和公司的技术合作伙伴生态系统所关注的。 在本月早些时候的文章中,我…

SpringMVC源码深度解析(中)

接上一遍博客《SpringMVC源码深度解析(上)》继续聊。最后聊到了SpringMVC的九大组建的初始化,以 HandlerMapping为例,SpringMVC提供了三个实现了,分别是:BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctio…

AI一站式科研写作利器:PaperPal

文章目录 在线编辑Word 插件 在线编辑 PaperPal是一款面向科研人员的写作工具,支持在线编辑以及Word插件。下面以在线编辑为例,详述PaperPal的润色功能。 进入网页后,点击【新建在线文档】,即可开启润色功能,界面如下…