1654. 到家的最少跳跃次数

2023-11-11

Tag

【广搜】【上限证明】【图论】

题目来源

1654. 到家的最少跳跃次数.
在这里插入图片描述

题目解读

找到从位置 0 跳跃到位置 x 的最小跳跃次数,跳跃规则如下:

  • 前进方向跳 a 个位置;
  • 后退方向跳 b 个位置;
  • 不能连续后退 2 次,也就是说,上一次是后退的,这次一定要前进;上次是前进的,这次可以前进也可以后退。
  • 有一个禁止数组 forbidden,表示禁止到达的位置。

如果没有合适的跳跃方案返回 -1

解题思路

本题求最小跳跃次数,是最短路问题。最短路问题一般都需要使用广度优先搜索,本题中的图是一个无限的图(因为有可能超过 x 位置后,还一直前进),因此需要限制搜索范围,否则无法处理无解的情况。

题目中已经给出了搜索的下限,不能跳到负整数位置,即下限 lower = 0,关于上限的寻找与证明,参考的是 newhar 的解答。

  • a >= b 即一次的前进距离大于等于后退距离时,当到达的位置大于 x + b 时,最多只能后退一次,也到不位置 x。这时不论怎么跳都不会到达位置 x 了。此时的搜索上限是 x + b
  • a < b 即一次的前进距离小于后退距离时,上限为 max(f + a +b, x) 具体证明请参考 newhar 的题解
  • 最终的上限定为 upper = max(f + a + b, x + b)

找到了搜索的下限与上限之后,在该范围内进行广度优先搜索,当前位置到达 x 处,返回对应的步数;直到在范围内搜索无结果,最终返回 -1

实现细节

维护一个队列,存放三元组 posdirstep,分别表示 当前的位置上一个是前进还是后退(前进为 1,后退为 -1)、当前的步数

维护一个已经到达的位置和方向的集合,存放 位置*方向

forbidden 数组存入集合中,方便查找。

在进行 while 循环时,无论上次是前进还是后退的,这次都可以前进。上次是前进的话,还可以前进。

实现代码

class Solution {
public:
    int minimumJumps(vector<int>& forbidden, int a, int b, int x) {
        queue<tuple<int, int, int>> q;  // 三元组(位置,方向,步数)
        unordered_set<int> visited;     // 已经到达的位置和方向 1表示前进 -1表示后退 存放位置*方向
        q.emplace(0, 1, 0);
        visited.emplace(0);

        int lower = 0, upper = max(*max_element(forbidden.begin(), forbidden.end()) + a, x) + b;
        unordered_set<int> forbSet(forbidden.begin(), forbidden.end());
        while (!q.empty()) {
            auto [pos, dir, step] = q.front();
            q.pop();
            // 到达位置,返回步数
            if (pos == x) {
                return step;
            }

            // 不论上一步是前进还是后退的,这一步都可以前进
            int nextPos = pos + a;
            int nextDir = 1;
            if (lower <= nextPos && nextPos <= upper && !visited.count(nextPos * nextDir) && !forbSet.count(nextPos)) {
                visited.emplace(nextPos * nextDir);
                q.emplace(nextPos, nextDir, step + 1);
            }

            // 如果上一步是前进的,这一步还可以后退
            if (dir == 1) {
                nextPos = pos - b;
                nextDir = -1;
                if (lower <= nextPos && nextPos <= upper && !visited.count(nextPos * nextDir) && !forbSet.count(nextPos)) {
                    visited.emplace(nextPos * nextDir);
                    q.emplace(nextPos, nextDir, step + 1);
                }
            }
        }
        // 到达搜索上限后,仍然没有找到合适的跳跃方案,返回 -1
        return -1;
    }
};

复杂度分析

时间复杂度为搜索上限: O ( m a x ( m a x ( f o r b i d d e n ) + a , x ) + b ) O(max(max(forbidden) + a, x) + b) O(max(max(forbidden)+a,x)+b)

空间复杂度为队列大小: O ( m a x ( m a x ( f o r b i d d e n ) + a , x ) + b ) O(max(max(forbidden) + a, x) + b) O(max(max(forbidden)+a,x)+b)

写在最后

以上就是本篇文章的内容了,感谢您的阅读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1654. 到家的最少跳跃次数 的相关文章

  • Java 中的 TreeSet 与 C#.net 的等效项

    我有 Java 代码 其中包含TreeSet 我想将代码转换为 C 我可以使用哪个等效集合 如果没有 请提出替代方案 那将是系统 集合 通用 SortedSet
  • VS Code:自定义关键字的注入语法范围在 C++ 中被覆盖

    我想制作一个小型 VS Code 扩展 为 C C 代码中的少数自定义关键字添加语法突出显示 我正在尝试通过注入语法来做到这一点source c and source cpp语言范围 遵循VS Code 语法高亮指南 https code
  • 无捕获 lambda 是结构类型吗?

    P1907R1 http www open std org jtc1 sc22 wg21 docs papers 2019 p1907r1 html 接受 C 20 引入结构类型 它们是非类型模板参数的有效类型 GCC 和 Clang 都接
  • 将 LUIS 与 FormFlow 集成

    我创建了一个机器人 里面有一个 FormFlow 现在 如果您输入 我想启动产品 LUIS 将告诉它必须转到哪个对话框 internal static IDialog
  • PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本

    我正在使用 Npgsql 3 0 3 0 和 PetaPoco 最新版本 当我运行这个命令时 var dateCreated DateTime Now just an example var sql new Sql WHERE date c
  • Microsoft.Web.Administration 内存泄漏

    拥有一个 Windows 服务 除其他外 还可以监视 IIS 应用程序池 如果任何池已配置应用程序但未运行 则该池 池 将启动 这已经运行良好一段时间了 最近发现该服务存在内存泄漏 查看内存转储 罪魁祸首是用于检查应用程序池的 Micros
  • 如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

    TL DR 如何将 JSON 字符串发送到带有 auth 标头的 REST 主机 我尝试了 3 种不同的方法 发现一种适用于匿名类型 为什么我不能使用匿名类型 我需要设置一个名为 Group Name 的变量 并且连字符不是有效的 C 标识
  • 如何在 VS 2013 的立即窗口中执行 LINQ 和/或 foreach?

    在调试过程中探测当前状态时 立即窗口是非常有用的工具 我了解到 通过使用问号 人们可以在那里做更多的事情 如图所示在这篇文章中 https stackoverflow com questions 32934635 execute metho
  • 重写 ASP.Net Core 中的 415 响应

    在 ASP net Core 2 1 中 我想返回 Json 响应以及状态代码 415 而不是默认返回的 415 为了实现这一点 我使用资源过滤器 public class MediaTypeResouceFilter Attribute
  • 为什么编译器不对同一翻译单元中的 ODR 违规发出警告

    在同一个翻译单元中 ODR 问题很容易诊断 那么为什么编译器不会针对同一翻译单元中的 ODR 违规发出警告呢 例如在下面的代码中https wandbox org permlink I0iyGdyw9ynRgny6 https wandbo
  • C# 如何在没有 GacUtil 的情况下在 GAC 中注册程序集?

    我需要使用批处理文件在 GAC 中注册程序集 有没有办法找到安装位置GacUtil exe或者有没有办法在没有 GacUtil 的情况下注册程序集 Your bestbet is to use a powershell script tha
  • 了解C/C++中函数调用的堆栈框架? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我也是 C C 和汇编语言的新手 这
  • 如何在调试时轻松查看事件订阅数量?

    在调试时 我可以查看一下textBox1 TextChanged查看事件订阅数量 如果是 那么我该如何钻取它 我需要知道在给定时间有多少订阅进行调试 因为看起来一个事件被多次触发 但我怀疑这个错误确实是因为textBox1 TextChan
  • 什么时候适合在 C++ 中使用 static(在未命名的命名空间上)?

    我一整天都在阅读有关未命名命名空间的文章 大多数文章都解释了何时应该在 static 关键字上使用未命名命名空间 但我仍然有一个大问题什么时候适合使用静态 毕竟它还没有完全弃用 那么带有静态函数的头文件我现在应该将它们放入未命名的命名空间中
  • NHibernate Criteria API 是否支持集合属性的投影?

    我需要使用条件 API 复制以下工作 HQL 查询 session CreateQuery select c from Parent p inner join p Children c where p Id 9 and c Id 33 Se
  • 同时运行 x 个网络请求

    我们公司有一个网络服务 我想通过我自己的服务发送 XML 文件 存储在我的驱动器上 HTTPWebRequestC 中的客户端 这已经有效了 Web服务同时支持5个同步请求 一旦服务器上的处理完成 我就会从Web服务获得响应 每个请求的处理
  • 最有用的用户制作的 C 宏(在 GCC 中,还有 C99)? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • Fluent Validation 将 CustomAsync 更改为 MustAsync

    有人可以帮我解决这个问题吗 我正在努力改变CustomAsync 到 MustAsync 但我无法让事情发挥作用 下面是我的自定义方法 RuleFor o gt o MustAsync o gt return CheckIdNumberAl
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上

随机推荐

  • java输入一个考生的成绩,用范围区间判断它是及格/良好/优秀等(两种方式,大学基础题)

    输入考生成绩是java初学者都会遇到的一个题目 这里作者给大家提供两种思路 可供参考 下图是题目要求 第一种方式 如下图所示 if循环 解题步骤 1 让用户输入并且用一个变量保存 2 通过if循环依次匹配分数段 如果输入的值 gt 100或
  • Python常用模块大全

    文章目录 Python常用模块大全 总结 一 时间模块time 与 datetime time 模块中的重要函数 time 模块时间格式转换 time 模块时间转换 ctime和asctime区别 datetime获取时间 datetime
  • Mac中使用的开发工具

    Go2Shell 在Finder的上框上新增一个按钮 单击打开当前目录下的terminal vssh 远程操纵服务器的利器 SourceTree github管理的图形界面软件 Sublime 强大又美观的代码编辑器 CLion C IDE
  • 三丰三坐标编程基本步骤_UG编程速成法,六个步骤教会你三坐标编程。

    简 单 编 程 测 量 方 法 1 目的 提高检测能力 以满足公司质量控制要求 确保零件的品质 2 范围 适用于批量性或工作量大的零件测量 3 支持 RationalDMIS 三坐标测量软件 FLY1086 三坐标测量机 4 内容 4 1
  • 修改远程桌面端口

    虽然网上很多了 但我还是经常忘记 先记下来先 修改远程桌面端口需要两个步骤 1 打开注册表 HKEY LOCAL MACHINE SYSTEM CurrentControlSet Control Terminal Server Wds rd
  • [1096]消除ADB错误“more than one device and emulator”的方法

    当我连着手机充电的时候 启动模拟器调试 执行ADB指令时 报错 C Users gaojs gt adb shell error more than one device and emulator C Users gaojs gt adb
  • unix网络编程源代码编译

    最近开始研究unix网络编程 正所谓 学习网络编程的最好方法就是下载这些程序 对其进行修改和改进 只有这样才能深入理解与有关概念和方法 1 首先下载源代码 不多说了 2 照着readme中的步骤往下做 第一步就出现问题了 输入命令 conf
  • 数据结构 堆树(最大堆、最小堆)

    一 堆树的定义 1 堆树是一颗完全二叉树 2 堆树中某个节点的值总是不大于或不小于其孩子节点的值 3 堆树中每个节点的子树都是堆树 当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆 也称大根堆 当父节点的键值总是小于或等于任何一个
  • casting java_Java学习14-对象类型转换(Casting)

    基本数据类型的Casting 1 自动类型转换 小的数据类型可以自动转换成大的数据类型 如long g 20 double d 12 0f 2 强制类型转换 可以把大的数据类型强制转换 casting 成小的数据类型 如 float f f
  • 【QT开发笔记-基础篇】

    本节对应的视频讲解 B 站 链 接 https www bilibili com video BV19B4y1s7YF 由于 QWidget 类是所有控件类的父类 因此本节课先讲解 QWidget 所有窗口类的基类 Qt 中有 3 个窗口的
  • DTH11温湿度传感器使用(stm32)

    可以参考这个博客 https blog csdn net qq 27508477 article details 83661672 但是由于stm32f103很难得到1us的时钟 而且使用HAL库没有直接的寄存器操作 所以需要一定的修改 这
  • 爬取新浪股票财务数据

    coding utf 8 import HTMLParser import urllib2 import sys type sys getfilesystemencoding 截止日期 每股净资产 每股收益 每股现金含量 每股资本公积金 固
  • ORACLE数据块

    下午在学习oracle 10g r2 concepts 在这留一笔 Oracle对数据库数据文件 datafile 中的存储空间进行管理的单位是数据块 data block 数据块是数据库中最小的 逻辑 数据单位 与数据块对应的 所有数据在
  • windows 10下vue 2.x 环境安装(npm网络环境不好时)

    windows 10下vue 环境安装 项目建立和运行 文章目录 windows 10下vue 环境安装 项目建立和运行 确定nodejs和npm已经安装 安装cnpm 安装vue 建立vue项目 使用vscode打开项目cnpm安装依赖
  • 一、OSI参考模型

    一 OSI参考模型 OSI Open System Interconnect 即开放式系统互连 一般都叫OSI参考模型 是ISO组织在1985年研究的网络互连模型 该体系结构标准定义了网络互连的七层框架 物理层 数据链路层 网络层 传输层
  • VMWare虚拟机文件夹共享不生效解决方法

    VMWare虚拟机文件夹共享不生效解决方法 mnt hgfs 中找不到共享文件夹 在安装了 vm tools 或 网上各种教程 vmhgfs fuse 都挂载不上可采取以下临时解决方法 1 关闭VMWare中的文件夹共享 2 重启虚拟机 3
  • nginx中健康检查(health_check)机制深入分析

    转自 https segmentfault com a 1190000002446630 很多人都知道nginx可以做反向代理和负载均衡 但是关于nginx的健康检查 health check 机制了解的不多 其实社区版nginx提供的he
  • 合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

    图表 Chart 一幅图胜过一千个字 通过图表展示出的数据内容能让用户更快速有效的了解数据特征 代码示例 创建图表 chart lvgl chart create lvgl scr act nil lvgl obj set size cha
  • 从零开始做单相逆变电源(硬件)

    文章目录 前言 一 主要模块需求 1 全桥模块 2 采样电路 光耦 前言 题目 单相正弦逆变电源 具体软件部分请参照从零开始做单相逆变电源 软件 一 主要模块需求 本系统以TM4C123GH6PM单片机 FPGA为控制核心 基于正弦脉冲宽度
  • 1654. 到家的最少跳跃次数

    文章目录 Tag 题目来源 题目解读 解题思路 实现细节 实现代码 复杂度分析 写在最后 Tag 广搜 上限证明 图论 题目来源 1654 到家的最少跳跃次数 题目解读 找到从位置 0 跳跃到位置 x 的最小跳跃次数 跳跃规则如下 前进方向