python 跳跃游戏
跳跃游戏合集
- [leetcode 55 跳跃游戏](https://leetcode-cn.com/problems/jump-game/)
- 一、贪心算法求解
- 1.1 求解思路
- 1.2 代码实现
- 1.3 复杂度
- 二、动态规划求解
- 2.1 求解思路——五部曲
- 2.2 代码实现
- 2.3 复杂度
leetcode 55 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后
一个下标。
一、贪心算法求解
1.1 求解思路
我们可以用贪心的方法解决这个问题。
对于每一个可以到达位置的索引为idxidxidx,它使得 idx+1,idx+2,⋯,idx+nums[idx]idx+1, idx+2, \cdots, idx+\textit{nums}[idx]idx+1,idx+2,⋯,idx+nums[idx] 这些最大覆盖范围内的位置都可以到达。
依次遍历数组中的每一个位置,并实时更新该位置的最大覆盖范围。对于当前遍历到的位置 xxx,如果它在最大覆盖范围内,那么我们就可以从起点通过若干次跳跃到达该位置,因此我们可以用 idx+nums[idx]idx + \textit{nums}[idx]idx+nums[idx]更新最远可以到达的位置。
在遍历的过程中,如果最大覆盖范围大于等于数组中的最后一个位置,那就说明最后一个位置可达,我们就可以直接返回 True 作为答案。反之,如果在遍历结束后,最后一个位置仍然不可达,我们就返回 False 作为答案。
1.2 代码实现
class Solution:def canJump(self, nums: List[int]) -> bool:right_most = 0 # 记录最大覆盖范围for idx, val in enumerate(nums[:-1]): # 忽略最后一个位置right_most = max(right_most, idx+val) # 当前位置上,最远能跳到哪# 如果最远都无法超过当前位置,那肯定无法到达最后一个位置,提前结束if right_most <= idx:return False return True
1.3 复杂度
时间复杂度:O(n)O(n)O(n),其中 nnn 为数组的大小。只需要访问 nums 数组一遍,共 nnn 个位置。
空间复杂度:O(1)O(1)O(1),不需要额外的空间开销。
二、动态规划求解
2.1 求解思路——五部曲
确定dp数组(dp table)以及下标的含义:
dp[i]表示在下标i处跳跃的覆盖范围。确定递推公式
对于dp[i],它等于dp[i-1]跳一格到达i处后剩余的步数,和nums[i]的最大值。因此得出状态转移方程为:dp[i]=max(dp[i−1]−1,nums[i])dp[i]=max(dp[i-1]-1,nums[i])dp[i]=max(dp[i−1]−1,nums[i])dp数组如何初始化
边界条件:dp[0]=nums[0]dp[0]=nums[0]dp[0]=nums[0]确定遍历顺序
在每次循环开始,我们判断dp[i-1]是否等于0,若是,则不可能到达下标i处,因此直接返回false。循环结束后 返回true举例推导dp数组
2.2 代码实现
class Solution:def canJump(self, nums: List[int]) -> bool:n = len(nums)dp = [0] * ndp[0] = nums[0]for i in range(1,n):if dp[i-1] == 0: return Falsedp[i] = max(dp[i-1]-1,nums[i])return True
2.3 复杂度
时间复杂度:O(n)O(n)O(n),其中 nnn 为数组的大小。只需要访问 nums 数组一遍,共 nnn 个位置。
空间复杂度:O(n)O(n)O(n)
python 跳跃游戏相关推荐
- lintcode: 跳跃游戏 II
跳跃游戏 II 给出一个非负整数数组,你最初定位在数组的第一个位置. 数组中的每个元素代表你在那个位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 样例 给出数组A = ...
- 我的世界python写游戏_用python写游戏之 Give it up
<永不言弃 Give It Up>,这是一款极具虐心色彩的音乐题材闯关游戏. 这篇文章就来分析这款游戏原理,并用python写出来一个简易版.废话不多说,直接开始分析. 游戏元素,暂且把主 ...
- python文件下载战_在您的Python平台游戏中放一些战利品
python文件下载战 这是正在进行的有关使用Pygame模块在Python 3中创建视频游戏的系列的一部分. 以前的文章是: 通过构建一个简单的骰子游戏,学习如何用Python编程 使用Pygame ...
- 45. 跳跃游戏 II
''' Author: 365JHWZGo Description: 45. 跳跃游戏 II Date: 2021-10-20 09:35:48 FilePath: Python\test\demo8 ...
- python小游戏小恐龙1
python小游戏小恐龙1 #coding=utf-8 #coding=gbk import pygame from itertools import cycle from pygame.locals ...
- Python小游戏(涂鸦射击)
Python小游戏(涂鸦射击:以飞机大战为基础) 项目规划 安装Pygame 游戏效果展示 开始游戏项目 设置可能用到的全局变量和导入需要的模块 类声明 类函数中用到的方法 项目规划 首次尝试,使用P ...
- 寓教于乐——PyGame游戏编程,Python小游戏制作实战教学
Python非常受欢迎的一个原因是它的应用领域非常广泛,其中就包括游戏开发.而是用Python进行游戏开发的首选模块就是PyGame. 1. 初识Pygame PyGame是跨平台Python模块,专 ...
- python什么框架写游戏好_免root修改器框架,免root框架大全,游戏框架免root:《游戏框架》 用python做游戏用什么框架-南开游戏网...
<游戏框架> 用python做游戏用什么框架 2020-11-25 17:37:36 广告 游戏作为一种分类框架 一个好的网计作品就必然有一个号的网页,那么我们来分析一下,在网页设计过程中 ...
- leetcode-45 跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4] 输 ...
最新文章
- Wide ResNet ResNeXt DenseNet DPNet [9] NASNet [10] SENet [11] Capsules [12
- java static修饰方法_浅析Java中static修饰符
- mate30pro什么时候可以升级鸿蒙,mate 30pro什么时候能装鸿蒙系统?
- h5微信本地调试 vue_Vue 移动端微信内H5调起支付(利用js sdk)
- php 留言板项目 ajax,PHP Ajax留言板
- Windows中Git无法显示中文
- 复购分析实践中,Pandas 遇到了大难题
- C#中通过Selenium定位a标签的问题
- maven 本地仓库的配置
- mysql酒店客房管理系统的设计_《酒店客房管理系统设计》总结
- CPU中控制器的功能
- word2019如何清除折叠黑色三角形的方法
- (转)罗振宇跨年演讲:哪来直接登顶的人生,只有不断迭代的历程
- 利用python进行识别相似图片(一)
- 【数字化转型的另类视角也许更务实】
- 体验ChatGPT后,陷入沉思...
- 【树莓派不吃灰】基础篇⑯ 搭建sqlite3数据库环境
- 一文搞定子网划分!子网掩码!超详细例题解析!
- 《产品管理精华》目录
- malloc申请内存空间失败