Python面试宝典第29题:袋鼠过河

题目

        一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子。每隔一米就有一个桩子,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米;如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了。给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达,则输出-1。

        输入描述:弹簧力量的数组。

        输出描述:输出最少的跳数,无法到达输出-1。

        示例 1:

输入:[2, 0, 1, 1, 1]
输出:4

        示例 2:

输入:[2, 1, 0, 1, 1]
输出:-1

        示例 3:

输入:[3, 3, 0, 0, 1, 1, 1]
输出:5

贪心算法

        在编程竞赛和面试中,袋鼠过河问题是一道富有策略性的试题。它要求我们对复杂问题进行逻辑分析,并利用相关算法来寻找最优解。

        为了找到袋鼠过河所需的最少跳跃次数,我们可以采用一种贪心策略。核心思路是在每一步选择能覆盖尽可能远的距离但又不会超过当前可到达范围的最大步长。具体来说,在每一步中,我们尝试确定下一步能够到达的最远位置,并更新当前可以到达的最远位置。如果在某一步我们发现无法进一步前进(即当前能够到达的最远位置小于下一个弹簧的位置),则返回-1表示无法过河。使用贪心算法求解本题的主要步骤如下。

        1、初始化两个变量farthest和current用于记录当前能够到达的最远位置和当前已经跳到的位置。

        2、初始化一个计数器steps用来记录跳跃次数。

        3、遍历弹簧的力量数组,对于每一个位置,计算从当前位置出发能够到达的最远位置。

        4、如果到达当前位置current,则更新当前位置current为最远位置farthest。如果current大于等于河流宽度,则返回steps。

        5、如果遍历完数组后仍然没有达到河流宽度,则返回-1。

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

def kangaroo_cross_river_greedy(springs):river_width = len(springs)# 当前能到达的最远位置farthest = 0# 当前已经跳到的位置current = 0# 跳跃次数steps = 0for i in range(river_width):# 如果当前位置弹簧力量为0,则无法跳跃,直接返回-1if springs[i] == 0 and i >= farthest:return -1# 更新最远可以到达的位置farthest = max(farthest, i + springs[i])# 如果当前位置就是当前可以到达的最远位置if i == current:steps += 1current = farthest# 如果当前已经跳到了河对岸或超过了河对岸if current >= river_width:return stepsreturn -1print(kangaroo_cross_river_greedy([2, 0, 1, 1, 1]))
print(kangaroo_cross_river_greedy([2, 1, 0, 1, 1]))
print(kangaroo_cross_river_greedy([3, 3, 0, 0, 1, 1, 1]))

动态规划法

        为了使用动态规划法解决本题,我们需要定义状态和状态转移方程。我们用dp[i]表示到达第i个弹簧所需的最少跳跃次数,问题的目标是找到dp[N]的值,其中N是最后一个有效弹簧的位置。使用动态规划法求解本题的主要步骤如下。

        1、初始化dp数组,设dp[0] = 1,因为初始位置已经确定,再跳一次就可以到达对岸。

        2、遍历数组,对于每个位置 i,考虑所有能到达 i 的位置 j。其中,j 在 i 的左侧,且j + springs[j] >= i。

        3、更新dp[i]为 min(dp[i], dp[j] + 1)。

        4、如果在遍历过程中没有更新dp[N],则无法到达对岸,返回-1。否则,返回dp[N]。

def kangaroo_cross_river_by_dp(springs):river_width = len(springs)# 初始化dp数组为无穷大dp = [float('inf')] * river_width# 袋鼠初始位置需要1次跳跃dp[0] = 1for i in range(1, river_width):# 如果弹簧力量为0,则无法通过此位置if springs[i] == 0:continuefor j in range(i):# 只有当j处的弹簧力量加上j的位置能够达到i时,才考虑if j + springs[j] >= i:# 更新到达i的最小跳跃次数dp[i] = min(dp[i], dp[j] + 1)# 如果dp[n-1]仍然为无穷大,说明无法到达return dp[river_width-1] if dp[river_width-1] != float('inf') else -1print(kangaroo_cross_river_by_dp([2, 0, 1, 1, 1]))
print(kangaroo_cross_river_by_dp([2, 1, 0, 1, 1]))
print(kangaroo_cross_river_by_dp([3, 3, 0, 0, 1, 1, 1]))

总结

        使用贪心算法求解本题的时间复杂度为O(n),因为它只需要遍历一次数组,其中n是弹簧的数量。其空间复杂度为O(1),只需要常数级别的额外空间。注意:贪心算法并不总是能得到最优解,只有在特定条件下才适用。

        使用动态规划法求解本题的时间复杂度为O(n^2),因为它需要遍历数组,并对每个位置执行内层循环。其空间复杂度为O(n),因为它需要一个额外的一维数组dp来存储中间结果。动态规划法适用于更广泛的问题类型,可以通过调整状态转移方程来适应不同的问题。

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

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

相关文章

Maven实战(五)- Nexus 私服安装与使用

Maven实战(五)- Nexus 私服安装与使用 文章目录 Maven实战(五)- Nexus 私服安装与使用1.安装Nexus1.1.下载安装包1.2.Nexus启动命令1.3.登陆Nexus 2.仓库与仓库组2.1.内置仓库2.2.仓库分类2.3.创建宿主仓库2.4.创建代理仓库2.5.创…

CSS基础知识day4

目录 1. 浮动 1.1 传统网页布局的三种方式 1.2 标准流(普通流/文档流) 1.3 为什么需要浮动? 1.4 什么是浮动? 1.5 浮动特性(重难点) 1.6 浮动元素经常和标准流父级搭配使用 2.常见网页布局 2.1 常…

WEB应用(十四)---文件上传

什么是文件上传漏洞 文件上传是Web应用的常见功能,允许用户上传图片、视频及其他文件类型文件。如果用户上传的是木马文件,则服务器就会收到攻击。 对于这个漏洞的练习有一个专门的靶场,即upload-labs,这个的安装可以在windows中使…

顺序表的实现【数据结构】

文章目录 1.线性表2.顺序表2.1 概念及结构 3.模拟实现3.1 准备工作3.2 顺序表的初始化与销毁3.3 顺序表的尾插3.4 顺序表的尾删3.5顺序表的打印3.6 顺序表的头插3.7 顺序表的头删3.8 顺序表查找3.9 顺序表在pos位置插入x3.10 顺序表删除pos位置的值 4.代码整合 1.线性表 线性表…

【Linux学习】深入理解软硬链接

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 🎈软硬链接🐧软链接🐬硬链接 🐸总结软硬链接的原理🐍软硬链接的应用场景&…

观成科技:海莲花活跃木马KSRAT加密通信分析

概述 自2023年8月至今,海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信,每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密,而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”组…

DC系列靶场---DC 7靶场的渗透测试

DC-7渗透测试 信息收集 地址探测 使用arpscan对目标地址进行探测 arp-scan -l I eth0 得到目标主机IP地址为172.30.1.132 扫描端口 使用nmap对目标主机做端口扫描 nmap -sS -sV -T4 -p- -O 172.30.1.132 扫描到目标主机开启了80端口、22端口。 -sS Nmap的SYN扫描&…

mapbox-gl 实现房间面生成墙(借助jsts)

文章目录 一、前言 一、前言 当我们从室外放大到室内展示室内图层时,我们可能只有房间面的数据,这时要展示房间墙数据,就需要借助工具对房间面进行缓冲,但是数据变动时,我们还要再次进行一下缓冲区生成操作。下面是借…

Copy as cURL 字段含义

当前端在开发过程中,遇到接口错误反馈给后端人员时,一般在此接口处右键复制为cURL。 格式如下: curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…

1.4 C 程序的编译过程与 CLion 调试技巧

目录 1 程序的编译过程 1.1 编写源代码 1.2 预处理(Preprocessing) 1.3 编译(Compilation) 1.4 汇编(Assembly) 1.5 链接(Linking) 1.6 执行 2 编译过程的输入输出文件概览 …

谷粒商城实战笔记-140-商城业务-nginx-搭建域名访问环境二(负载均衡到网关)

文章目录 一,通过域名访问商城架构设计1,为什么nginx要将请求转发给网关2,架构设计 二,配置1,nginx配置1.1 nginx.conf1.2 gulimall.conf1.3 配置原理 2,网关配置 三,记录2个问题1,网…

【C++】初识面向对象:类与对象详解

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性 本章将介绍C中一个重要的概念——类。通过类,我们可以类中定义成员变量和成员函数,实现模块化封装,从而构建更加抽象和复杂的工程。 &…

基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 MSER 4.2 HOG特征提取 4.3 SVM 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2017b 3.部分核心程序 (完整版代码包含中…

CMU15445 (Fall 2023) Project 1 - Buffer Pool 思路分享

文章目录 写在前面Task 1 - LRU-K Replacement PolicyTask 2 - Disk SchedulerTask 3 - Buffer Pool ManagerNewPageFetchPageUnpinPageDeletePageFlushPage 写在最后 写在前面 操作系统为应用程序提供了默认的缓存机制,DBMS作为应用程序,为什么不使用默…

LSLM论文

解决的问题 现在的语音模型(SLM)增强了语音对话的能力,但都局限于回合制对话,在实时对话的情境下与用户交互的能力有所欠缺,例如:当生成的对话不满意时被打断。所以,这篇论文在实时的的语音语言…

ShardingSphere自定义分布式主键生成策略、自定义分片规则

文章目录 主键生成策略源码KeyGenerateAlgorithm源码入口实现扩展 自定义分布式主键生成策略 分片算法ShardingAlgorithm实现扩展 自定义分片算法踩的坑 主键生成策略源码 开发者手册 KeyGenerateAlgorithm 全限定类名org.apache.shardingsphere.sharding.spi.KeyGenerateAl…

QT界面设计开发(Visual Studio 2019)—学习记录一

一、控件升级 简要介绍: 简单来说,控件提升就是将一个基础控件(Base Widget)转换为一个更特定、更复杂的自定义控件(Custom Widget)。这样做的目的是为了在设计界面时能够使用更多高级功能,而不…

环境搭建:全面详尽的 MongoDB Shell MongoDB Server介绍、安装、验证与配置指南(以 Windows 系统为主)

环境搭建:全面详尽的 MongoDB Shell & MongoDB Server介绍、安装、验证与配置指南(以 Windows 系统为主) MongoDB 是一个基于文档的 NoSQL 数据库,以其高性能、灵活性和可扩展性而受到广泛欢迎。本文将带您完成 MongoDB 的安装…

bpmn简单使用(制作流程图)

1、先下载依赖,下面是我下载的版本 "bpmn-io/properties-panel": "^3.23.0", "bpmn-js": "^17.9.1", "bpmn-js-properties-panel": "^5.6.1", "camunda-bpmn-moddle": "^7.0.1",…

CTFHUB-web-RCE-eval执行

开启题目 查看源码发现直接用蚁剑连接就可以,连接之后发现成功了