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,听音乐,同时上网浏览网页。这是我们看得到的任务,在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统,具备…

XML Schema 复合类型 - 仅含元素

XML Schema 复合类型 - 仅含元素 引言 XML Schema 是一种用于定义 XML 文档结构和内容的语言。它提供了一种强大的方式来描述 XML 文档中允许的元素和属性,以及它们之间的关系。在 XML Schema 中,复合类型是一种重要的概念,它允许开发者定义包含其他元素或属性的复杂结构。…

JVM--HostSpot算法细节实现

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

递归遍历树结构,前端传入一整颗树,后端处理这个树,包括生成树的id和pid等信息,

递归逻辑 递归遍历树结构&#xff0c;将树结构转换list集合 并添加到 flowStepTree 集合 // 递归遍历树结构&#xff0c;将树结构转换list集合 并添加到 flowStepTree 集合private static void settingTree(ProductFlowStepVO node, Long parentId, String ancestors, List<…

时间序列预测方法概述

这里写目录标题 时间序列预测方法概述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.&#xff0c;手动换行。…

基本的CRUD操作与数据库原理

目录 引言 一、MySQL及其特点 二、CRUD操作详解 1. 创建&#xff08;Create&#xff09; 2. 读取&#xff08;Read&#xff09; 3. 更新&#xff08;Update&#xff09; 4. 删除&#xff08;Delete&#xff09; 三、数据库原理概述 1. 数据库与表 2. 数据类型 3. 索引…

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

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

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

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

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

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

Flutter 开源库学习

网上看了好多歌词实现逻辑相关资料&#xff0c;封装比较的好的 就 flutter_lyric&#xff0c;核心类是LyricsReader&#xff0c;而且如果实现逐字逐句歌词编辑功能还需要自己实现很多细节 &#xff0c;网友原话是 &#xff1a;歌词的功能真的是不少&#xff0c;写起来也是挺难的…

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

文章目录 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6;一、Celery⭐1.基本概念及介绍:✨2.使用步骤&#x1f4ab; 二、订单超时 取消订单&#xff08;Celery&#xff09;&#x1f525;具体实现流程&#x1f4d6; 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6; 在构建复…

力扣 20. 有效的括号,496. 下一个更大元素 I,739. 每日温度,856. 括号的分数,32. 最长有效括号

20. 有效的括号 题目 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的…

GIT命令学习 二

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

QListWidget开发详解

QListWidget开发详解 一、QListWidget基本使用1.1 创建 QListWidget1.2 QListWidget添加项1.3 QListWidget删除项1.4 QListWidget获取和设置项 二、QListWidget响应用户交互2.1 QListWidget的单击响应2.3 QListWidget的 currentItemChanged2.3 QListWidget的右键餐单 三、QList…

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

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

MySQL8的备份方案——差异备份(CentOS)

MySQL8的差异备份 一、安装备份工具二、备份数据三、准备恢复所需的备份数据四、 恢复备份文件 点击跳转全量(完全)备份 点击跳转增量备份 点击跳转压缩备份 一、安装备份工具 官网 下载地址 备份所用工具为percona-xtrabackup 如果下方安装工具的教程失效&#xff0c;请点击…