Python每日一练(20230511) 跳跃游戏 I\II\III\IV

news2024/11/28 21:32:26

目录

1. 跳跃游戏 Jump Game I

2. 跳跃游戏 Jump Game II

3. 跳跃游戏 Jump Game III

4. 跳跃游戏 Jump Game IV

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 跳跃游戏 Jump Game I

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

提示:

  • 1 <= nums.length <= 3 * 10^4
  • 0 <= nums[i] <= 10^5

 代码1: 贪心算法

class Solution:
    def canJump(self, nums):
        n = len(nums)
        max_pos = 0
        for i in range(n):
            if i > max_pos:
                return False
            max_pos = max(max_pos, i+nums[i])
        return True

# %%
s = Solution()
print(s.canJump(nums = [2,3,1,1,4]))
print(s.canJump(nums = [3,2,1,0,4]))

 代码2: 回溯算法

class Solution:
    def canJump(self,nums):
        def backtrack(pos):
            if pos == len(nums) - 1:
                return True
            furthestJump = min(pos + nums[pos], len(nums) - 1)
            for nextPos in range(furthestJump, pos, -1):
                if backtrack(nextPos):
                    return True
            return False
        return backtrack(0)


# %%
s = Solution()
print(s.canJump(nums = [2,3,1,1,4]))
print(s.canJump(nums = [3,2,1,0,4]))

 代码3: 反向贪心算法

class Solution:
    def canJump(self, nums):
        n = len(nums)
        last_pos = n - 1
        for i in range(n - 2, -1, -1):
            if i + nums[i] >= last_pos:
                last_pos = i
        return last_pos == 0

# %%
s = Solution()
print(s.canJump(nums = [2,3,1,1,4]))
print(s.canJump(nums = [3,2,1,0,4]))

 代码4: 动态规划

class Solution:
    def canJump(self, nums):
        n = len(nums)
        dp = [False] * n
        dp[0] = True
        for i in range(1, n):
            for j in range(i):
                if dp[j] and j + nums[j] >= i:
                    dp[i] = True
                    break
        return dp[n-1]

# %%
s = Solution()
print(s.canJump(nums = [2,3,1,1,4]))
print(s.canJump(nums = [3,2,1,0,4]))

输出:

True
False


2. 跳跃游戏 Jump Game II

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000

代码1: 贪心算法

class Solution:
    def jump(self, nums):
        if len(nums) <= 1:
            return 0
        end = 0 + nums[0]
        start = 0
        step = 1
        maxDis = 0 + nums[0]
        while end < len(nums) - 1:
            for i in range(start + 1, end + 1):
                maxDis = max(maxDis, nums[i] + i)
            start = end
            end = maxDis
            step += 1
        return step
# %%
s = Solution()
print(s.jump(nums = [2,3,1,1,4]))
print(s.jump(nums = [2,3,0,1,4]))

代码2: 贪心算法

class Solution:
    def jump(self, nums):
        end, max_pos, steps = 0, 0, 0
        for i in range(len(nums) - 1):
            max_pos = max(max_pos, i + nums[i])
            if i == end:
                end = max_pos
                steps += 1
        return steps

# %%
s = Solution()
print(s.jump(nums = [2,3,1,1,4]))
print(s.jump(nums = [2,3,0,1,4]))

 代码3: 动态规划

class Solution:
    def jump(self,nums):
        n = len(nums)
        dp = [0] * n
        for i in range(1, n):
            dp[i] = float('inf')
            for j in range(i):
                if j + nums[j] >= i:
                    dp[i] = min(dp[i], dp[j] + 1)
        return dp[n-1]

# %%
s = Solution()
print(s.jump(nums = [2,3,1,1,4]))
print(s.jump(nums = [2,3,0,1,4]))

输出:

2
2


3. 跳跃游戏 Jump Game III

这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]

请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。

注意,不管是什么情况下,你都无法跳到数组之外。

示例 1:

输入:arr = [4,2,3,0,3,1,2], start = 5
输出:true
解释:
到达值为 0 的下标 3 有以下可能方案: 
下标 5 -> 下标 4 -> 下标 1 -> 下标 3 
下标 5 -> 下标 6 -> 下标 4 -> 下标 1 -> 下标 3 

示例 2:

输入:arr = [4,2,3,0,3,1,2], start = 0
输出:true 
解释:
到达值为 0 的下标 3 有以下可能方案: 
下标 0 -> 下标 4 -> 下标 1 -> 下标 3

示例 3:

输入:arr = [3,0,2,1,2], start = 2
输出:false
解释:无法到达值为 0 的下标 1 处。 

提示:

  • 1 <= arr.length <= 5 * 10^4
  • 0 <= arr[i] < arr.length
  • 0 <= start < arr.length

代码: dfs\bfs

class Solution:
    def canReach_dfs(self, arr, start):
        visited = set() # 存储已经访问过的节点
        def dfs(index):
            # 判断是否到达了值为 0 的位置
            if arr[index] == 0:
                return True
            # 标记当前节点为已访问
            visited.add(index)
            # 向左侧跳跃
            if index - arr[index] >= 0 and index - arr[index] not in visited:
                if dfs(index - arr[index]):
                    return True
            # 向右侧跳跃
            if index + arr[index] < len(arr) and index + arr[index] not in visited:
                if dfs(index + arr[index]):
                    return True
            # 无法到达值为 0 的位置
            return False
        return dfs(start)

    def canReach_bfs(self, arr, start):
        from collections import deque
        queue = deque([start])
        visited = set([start])
        while queue:
            index = queue.popleft()
            # 判断是否到达了值为 0 的位置
            if arr[index] == 0:
                return True
            # 向左侧跳跃
            if index - arr[index] >= 0 and index - arr[index] not in visited:
                queue.append(index - arr[index])
                visited.add(index - arr[index])
            # 向右侧跳跃
            if index + arr[index] < len(arr) and index + arr[index] not in visited:
                queue.append(index + arr[index])
                visited.add(index + arr[index])
        # 无法到达值为 0 的位置
        return False

# %%
s = Solution()
print(s.canReach_dfs(arr = [4,2,3,0,3,1,2], start = 5))
print(s.canReach_bfs(arr = [4,2,3,0,3,1,2], start = 5))

print(s.canReach_dfs(arr = [4,2,3,0,3,1,2], start = 0))
print(s.canReach_bfs(arr = [4,2,3,0,3,1,2], start = 0))

print(s.canReach_dfs(arr = [3,0,2,1,2], start = 2))
print(s.canReach_bfs(arr = [3,0,2,1,2], start = 2))

输出:

True
True
True
True
False
False


4. 跳跃游戏 Jump Game IV

给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。

每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j :

  • i + 1 需满足:i + 1 < arr.length
  • i - 1 需满足:i - 1 >= 0
  • j 需满足:arr[i] == arr[j] 且 i != j

请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。

注意:任何时候你都不能跳到数组外面。

示例 1:

输入:arr = [100,-23,-23,404,100,23,23,23,3,404]
输出:3
解释:那你需要跳跃 3 次,下标依次为 0 --> 4 --> 3 --> 9 。下标 9 为数组的最后一个元素的下标。

示例 2:

输入:arr = [7]
输出:0
解释:一开始就在最后一个元素处,所以你不需要跳跃。

示例 3:

输入:arr = [7,6,9,6,9,6,9,7]
输出:1
解释:你可以直接从下标 0 处跳到下标 7 处,也就是数组的最后一个元素处。

提示:

  • 1 <= arr.length <= 5 * 10^4
  • -10^8 <= arr[i] <= 10^8

代码1: bfs

from collections import deque
class Solution:
    def minJumps(self, arr):
        n = len(arr)
        if n == 1:
            return 0
        # 将相同值的位置加入同一个集合中
        value2index = {}
        for i, value in enumerate(arr):
            if value not in value2index:
                value2index[value] = set()
            value2index[value].add(i)
        # BFS 开始前的初始化
        queue = deque([(0, 0)]) # 存储节点的队列,第一项为节点编号,第二项为到达该节点的最少操作数
        visited = set() # 存储已经访问过的节点
        visited.add(0)
        # BFS 遍历
        while queue:
            index, step = queue.popleft()
            if index == n - 1:
                return step
            # 向左侧跳跃
            if index - 1 >= 0 and index - 1 not in visited:
                queue.append((index - 1, step + 1))
                visited.add(index - 1)
            # 向右侧跳跃
            if index + 1 < n and index + 1 not in visited:
                queue.append((index + 1, step + 1))
                visited.add(index + 1)
            # 跳到同值的位置
            if arr[index] in value2index:
                for j in value2index[arr[index]]:
                    if j not in visited:
                        queue.append((j, step + 1))
                        visited.add(j)
                del value2index[arr[index]] # 避免重复访问
        return -1 # 无法到达终点

# %%
s = Solution()
print(s.minJumps(arr = [100,-23,-23,404,100,23,23,23,3,404]))
print(s.minJumps(arr = [7]))
print(s.minJumps(arr = [7,6,9,6,9,6,9,7]))

代码2: bfs + 贪心算法

from collections import deque
class Solution:
    def minJumps(self, arr):
        n = len(arr)
        if n == 1:
            return 0
        # 构建同值位置哈希表
        value2index = {}
        for i, value in enumerate(arr):
            if value not in value2index:
                value2index[value] = []
            value2index[value].append(i)
        # BFS 开始前的初始化
        queue = deque([0])
        visited = set([0])
        step = 0
        # BFS 遍历
        while queue:
            size = len(queue)
            for _ in range(size):
                index = queue.popleft()
                # 判断是否到达终点
                if index == n - 1:
                    return step
                # 跳到同值位置
                if arr[index] in value2index:
                    for j in value2index[arr[index]]:
                        if j != index and j not in visited:
                            queue.append(j)
                            visited.add(j)
                    del value2index[arr[index]]
                # 向左侧跳跃
                if index - 1 >= 0 and index - 1 not in visited:
                    queue.append(index - 1)
                    visited.add(index - 1)
                # 向右侧跳跃
                if index + 1 < n and index + 1 not in visited:
                    queue.append(index + 1)
                    visited.add(index + 1)
            step += 1
        return -1 # 无法到达终点

# %%
s = Solution()
print(s.minJumps(arr = [100,-23,-23,404,100,23,23,23,3,404]))
print(s.minJumps(arr = [7]))
print(s.minJumps(arr = [7,6,9,6,9,6,9,7]))

输出:

3
0
1


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

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

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

相关文章

操作符知识点大全(简洁,全面,含使用场景,演示,代码)

目录 一.算术操作符 1.要点&#xff1a; 二.负数原码&#xff0c;反码&#xff0c;补码的互推 1.按位取反操作符&#xff1a;~&#xff08;二进制位&#xff09; 2.原反补互推演示 三.进制位的表示 1.不同进制位的特征&#xff1a; 2.二进制位表示 3.整型的二进制表…

如何利用python实现灰色关联分析?

1.灰色关联分析简介 灰色系统这个概念是相对于白色系统和黑色系统而言的。从控制论的知识里&#xff0c;颜色一般代表对于一个系统我们已知信息的多少&#xff0c;白色代表信息量充足&#xff0c;黑色代表我们其中的构造并不清楚的系统&#xff0c;而灰色介于两者之间&#xf…

WhatsApp如何让客户参与变得更简单?

WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要&#xff0c;你可能已经把它们纳入你的社交媒体战略。 是的&#xff0c;WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天&#xff0c;它也适用于商业。 在发展WhatsApp业务时&#xff0c;小企业主得到了最优…

K8s基础9——服务发现Coredns、Ingress Controller多种暴露方式、TLS+DaemonSet、Headless Services

文章目录 一、服务发现机制1.1 环境变量注入1.2 DNS解析 二、Ingress4.1 部署Ingress controller4.2 暴露Ingress Controller4.2.1 SVC NodePort方式4.2.2 共享宿主机网络方式 4.3 默认后端4.4 同域名不同URL转不同服务4.5 不同域名转不同服务4.6 使用https4.6.1 安装cfssl4.6.…

如何用 Serverless 一键部署 Stable Diffusion?

作者 | 寒斜&#xff08;阿里云智能技术专家&#xff09; 思路 其实很简单&#xff0c; 我们只需要将镜像里面的动态路径映射到 NAS文件存储里面即可&#xff0c;利用 NAS 独立存储文件模型&#xff0c;扩展&#xff0c;语言包等&#xff0c;并且我们可以为管理 NAS 单独配置…

使用Python和Django构建一个全功能的在线医疗问诊平台

在线医疗问诊平台应运而生&#xff0c;为患者和医生之间提供了一个便捷的交流平台。本文将介绍如何使用Python和Django构建一个全功能的在线医疗问诊平台。 功能 在我们的平台上&#xff0c;患者可以注册账户、查询医生、预约诊断、支付费用并与医生沟通。医生可以创建个人档…

【.NET CORE】使用Rotativa.AspNetCore将网页转换为PDF

插件功能&#xff1a;将在线网页转换为PDF显示&#xff0c;文件保存 组件配置&#xff1a; 1、在NuGet管理中搜索Rotativa.AspNetCore并安装稳定版&#xff0c;项目github地址&#xff1a;GitHub - webgio/Rotativa.AspNetCore: Rotativa for Asp.Net Core 2、github下载项目…

Docker安装部署MySQL

1、拉取镜像 docker pull mysql:8.0 2、查看镜像 docker images 3、创建文件夹 mkdir ~/mysql cd mysql/ 4、创建并启动MySQL容器 docker run -id \ > -p 3306:3306 \ > --namec_mysql \ > -v $PWD/conf:/etc/mysql/conf.d \ > -v $PWD/logs:/logs \ > -…

Vue Emelent-UI表格合并行或列rowspan和colspan的作用

Vue Element-UI的table组件支持合并行或者列&#xff0c;在这里做个简单的学习笔记。 我们可以通过rowspan和colspan来进行单元格合并&#xff0c;那么这两个属性是什么意思呢&#xff0c;通过官方给的demo来探讨下。 上述单元格将行index为奇数的第一列和第二列合并为一个单…

python dict 取值方法

在日常工作中&#xff0c;我们经常会遇到需要将一些数据转换为 dict格式的情况。比如&#xff1a; 1、想要将多个数组按照某种规则进行排列&#xff0c;形成有序的数据表&#xff0c;这时需要使用 dict函数。 3、想要将数据按照指定的方式进行存储&#xff0c;比如&#xff1a;…

Maven自定义配置

修改maven默认字符编码 maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 修改UTF-8为默认编码.设置系统环境变量 变量名MAVEN_OPTS 变量值-Dfile.encodingUTF-8 还可以添加其他配置&#xff0c;比如&#xff1a; -Xms256m -Xmx512m…

IDEA编译JDK1.8源码及运行测试

———————————————— 版权声明&#xff1a;本文为CSDN博主「神韵499」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 原文链接&#xff1a;https://blog.csdn.net/qq_41055045/article/details/112002440 ————…

【Qt编程之Widgets模块】-004:QTableWidget及基本操作

QTableWidget及基本操作 1. 概述2. 主要操作函数2.1 QTableWidgets实例化2.2 设置表头 setHorizontalHeaderLabels2.3 单元格选择&#xff1a;setSelectionBehavior2.4 设置列数 setColumnCount2.5 设置行数 setRowCount2.6 网格的显示 setShowGrid2.7 添加表项 setItem2.8 表项…

常见的锁和zookeeper

zookeeper 本文由 简悦 SimpRead 转码&#xff0c; 原文地址 zhuanlan.zhihu.com 前言 只有光头才能变强。 文本已收录至我的 GitHub 仓库&#xff0c;欢迎 Star&#xff1a;https://github.com/ZhongFuCheng3y/3y 上次写了一篇 什么是消息队列&#xff1f;以后&#xff0c;本来…

Ubuntu 20.04.5 LTS x86_64 Docker stable diffusion webui 及 http api接口

资源 Docker镜像 docker pull darkroot1234/ayanami:latest 参考地址&#xff1a; docker一键运行stable diffusion webui&#xff0c;常用插件和功能完备&#xff0c;获得镜像后可打包带走 - 哔哩哔哩 nvidia cuda 驱动 https://us.download.nvidia.cn/XFree86/aarch64/…

Django框架005:阶段性`实战小案例`“答辩“公司员工表

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

基于 DDR3 的串口传图帧缓存系统设计实现(整体设计)

文章目录 前言一、串口传图顶层系统设计框图二、各模块说明三、系统工程及 IP 创建四、uart_ddr3_tft模块五、uart_ddr3_tft模块仿真文件六、uart_ddr3_tft模块仿真文件 前言 结合串口接收模块和 tft 显示屏控制模块&#xff0c;设计一个基于 DDR3 的串口传图帧缓存系统。 提示…

DES加密算法、RSA加密算法

DES加密算法 DES加密过程 1、将明文和密钥转化为ASCII码&#xff0c;明文64位bit&#xff0c;密钥56位 2、明文进行初始置换 3、明文初始置换后前32位为L0&#xff0c;后32位为R0 4、第一轮算法&#xff0c;L1R0&#xff0c;R0进行F运算后跟L0异或的结果为R1 5、F运算&#x…

jmeter如何测试一个get请求

目录 1.配置测试计划1.1.创建线程组1.2.创建GET的HTTP请求取样器&#xff08;模拟GET请求&#xff09;1.3.添加查看结果树和聚合报告 2.执行压测并查看结果2.1.验证接口2.2.执行压力测试 使用jmeter测试一个http的get请求示例. 1.配置测试计划 1.1.创建线程组 打开jmeter - 测…

C语言实现扫雷(包含递归展开)

目录 一&#xff1a;扫雷游戏的基础逻辑 二&#xff1a;关于扫雷相关的信息存储 三&#xff1a;游戏大体实现逻辑 四&#xff1a;具体实现 (1)初始化 (2)打印 (3)布置雷 (4)查雷 五&#xff1a;全部代码 (1)game.h (2)game.c (3)test.c 六&#xff1a;实际效果演示…