1654. 到家的最少跳跃次数

news2024/11/18 2:25:35

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 实现细节
    • 实现代码
    • 复杂度分析
  • 写在最后

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)

写在最后

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

如果感到有所收获的话可以给博主点一个 👍 哦。

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出。💬💬💬

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

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

相关文章

OJ练习第156题——带因子的二叉树

带因子的二叉树 力扣链接&#xff1a;823. 带因子的二叉树 题目描述 给出一个含有不重复整数元素的数组 arr &#xff0c;每个整数 arr[i] 均大于 1。 用这些整数来构建二叉树&#xff0c;每个整数可以使用任意次数。其中&#xff1a;每个非叶结点的值应等于它的两个子结点…

LC315. 计算右侧小于当前元素的个数(归并排序 - java)

计算右侧小于当前元素的个数 题目描述归并排序代码演示: 上期经典 题目描述 难度 - 困难 原题链接 - 计算右侧小于当前元素的个数 给你一个整数数组 nums &#xff0c;按要求返回一个新数组 counts 。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums…

【OJ比赛日历】快周末了,不来一场比赛吗? #09.03-09.09 #12场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-09-03&#xff08;周日&#xff09; #5场比赛2023-09-04…

代码随想录笔记--字符串篇

目录 1--反转字符串 2--反转字符串II 3--反转字符串中的单词 4--KMP算法 5--重复的子字符串 1--反转字符串 主要思路&#xff1a; 双指针算法&#xff0c;交换两个指针的字符&#xff1b; #include <iostream> #include <vector>class Solution { public:void…

Unity ShaderGraph教程——进阶shader

1.水面&#xff08;一&#xff09; 公式&#xff1a;场景深度 节点深度 — 屏幕空间位置的W向量 半透明物体与不透明物体的相交边缘 原理&#xff1a;场景深度 节点深度包含透明像素&#xff0c;屏幕空间w向量不包含透明像素。 注意&#xff1a;需要在UniversalRP-xxxQuali…

PHP旅游管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 旅游管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP 旅游管理系统 源码下载地址&#xff1a; https://download.csdn.net/download/qq_41…

linux centos7 系统之编程:求水仙花数

在Python编程中&#xff0c;有列表、元组和字典三类变量可以使用&#xff0c;方便数据的存储与处理&#xff0c;而bash中仅有字符串变量、数组、函数可用&#xff0c;方法运用上受到限制&#xff0c;这与bash基于C语言&#xff0c;注重语法结构的严谨有关。而Python等高级语言更…

JS数组原理探究!

JavaScript 数组的 API 经常会被 JS 开发者频繁使用&#xff0c;在整个 JavaScript 的学习过程中尤为重要。 数组作为一个最基础的一维数据结构&#xff0c;在各种编程语言中都充当着至关重要的角色&#xff0c;你很难想象没有数组的编程语言会是什么模样。特别是 JavaScript&…

Stable Diffusion 提示词技巧

文章目录 背景介绍如何写好提示词提示词的语法正向提示词负向提示词 随着AI技术的不断发展&#xff0c;越来越多的新算法涌现出来&#xff0c;例如Stable Diffusion、Midjourney、Dall-E等。相较于传统算法如GAN和VAE&#xff0c;这些新算法在生成高分辨率、高质量的图片方面表…

可控生成:ControlNet原理

论文&#xff1a;Adding Conditional Control to Text-to-Image Diffusion Models 代码&#xff1a;lllyasviel/ControlNet 简单来说ControlNet希望通过输入额外条件来控制大型图像生成模型&#xff0c;使得图像生成模型根据可控。 1. 动机 当前文生图任务中会出现如下问题&…

【LeetCode】剑指 Offer Ⅱ 第5章:哈希表(6道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案哈希表的设计剑指 Offer II 030. 插入、删除和随机访问都是O(1) 的容器HashMap ArrayList ⭐剑指 Offer II 031. LRU 缓存HashMap 双向链表 ⭐哈希表的应用剑指 Offer II 032. 有效的变位…

pytorch中 nn.Conv2d的简单用法

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue,padding_modezeros)参数介绍&#xff1a; in_channels&#xff1a;卷积层输入通道数 out_channels&#xff1a;卷积层输出通道数 kernel_size&#xff1a;卷积层的…

AZ900备考

文章目录 云服务的概念云服务模型云服务类型消费的模型云服务的好处可靠性和可预测性的优势云中的管理 Azure 体系结构和服务核心结构组件物理基础结构组件 Azure计算和网络服务Azure 存储服务身份认证AD身份认证 Azure 管理和治理成本管理治理合规性的功能和工具管理和部署Azu…

Java设计模式:四、行为型模式-05:备忘录模式

文章目录 一、定义&#xff1a;备忘录模式二、模拟场景&#xff1a;备忘录模式三、改善代码&#xff1a;备忘录模式3.1 工程结构3.2 备忘录模式模型结构图3.3 备忘录模式定义3.3.1 配置信息类3.3.2 备忘录类3.3.3 记录者类3.3.4 管理员类 3.4 单元测试 四、总结&#xff1a;备忘…

如何构建自己的技术博客

本文相关知识点&#xff1a; markdownVuepress/vitepressGitHub pages 托管服务 为什么建议搭建个人博客网站 拥有自己的技术博客&#xff0c;不仅可以提升自己的技术能力&#xff0c;还可以提升自己的影响力&#xff0c;未来也可能带来一些“睡后”收益。 对于我们职场新人…

QTday2(登录界面+跳转——小黄人篇)

1.完成登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 form.h&#xff1a; #ifndef FORM_H #define FORM_H#include <QWidget> #include <QPushButton> #include <QDebug> #include <QLineEdit> //行编辑器 #include <QLab…

W5500-EVB-PICO主动PING主机IP检测连通性(十)

前言 上一章我们用W5500_EVB_PICO 开发板做UDP组播数据回环测试&#xff0c;那么本章我们进行W5500_EVB_PICO Ping的测试。 什么是PING&#xff1f; Ping &#xff08;Packet Internet Groper&#xff09;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序 。Ping是…

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…

Android基础之Activity生命周期

Activity是Android四大组件之一、称为之首也恰如其分。 Activity直接翻译为中文叫活动。在Android系统中Activity就是我看到的一个完整的界面。 界面中看到的TextView(文字&#xff09;、Button(按钮)、ImageView&#xff08;图片&#xff09;都是需要Activity来承载的。 总…

linux免密登录最简单--图文详解

最简单的免密登录 1.A电脑生成秘钥 ssh-keygen -t rsa 2.A电脑将秘钥传给B电脑 ssh-copy-id root192.168.1.129 #将秘钥直接传给B电脑 需要输入B电脑的密码&#xff0c;可以看到成功。 3.测试 同理&#xff1a;如果B->A也需要免密登录&#xff0c;统一的操作。 大功告…