news 2026/5/10 0:32:44

BFS解力扣1654最短跳跃次数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BFS解力扣1654最短跳跃次数

对于 LeetCode 1654 “到家的最少跳跃次数”这道题,核心是使用广度优先搜索 (BFS)来寻找从起点0到目标位置x的最短路径。解题的关键在于对搜索空间进行合理的限制,并正确处理“不能连续向后跳”的约束

问题解构与约束分析

约束条件说明
跳跃规则1. 向前跳a步。
2. 向后跳b步。
特殊限制1.不能连续两次向后跳
2. 不能跳到forbidden数组中的位置。
3. 不能跳到负数位置。
目标从位置 `
0出发,到达位置x` 的最少跳跃次数

关键难点与解决方案

  1. 无限搜索空间:由于可以向前和向后跳,理论上搜索可以无限进行。必须设定一个合理的上界
  2. “不能连续向后跳”:需要在状态中记录上一次跳跃的方向,以决定本次可选的跳跃方式。
  3. 状态定义与去重:一个位置可能被以不同的“上次跳跃方向”访问到,需要记录(位置, 上次是否向后跳)这样一个组合状态来避免重复搜索。

方案推演与核心思路

  1. BFS 状态设计

    • 每个 BFS 节点需要包含:(当前位置 cur, 上次是否向后跳 is_back, 当前步数 step)
    • 使用一个集合visited记录已访问的(cur, is_back)状态,避免重复搜索。
  2. 搜索上界确定

    • 参考中的分析,一个常用的、安全的右边界是max(max(forbidden) + a, x) + b。更保守且普遍采用的上界是6000(根据题目数据范围,这是一个经验值,足以覆盖所有可达状态)。本文将采用6000作为上界。
  3. BFS 过程

    • 从初始状态(0, False, 0)开始。
    • 对于每个状态(cur, is_back, step)
      • 如果cur == x,返回step
      • 尝试向前跳next_cur = cur + a。若位置合法、非禁止、且状态未访问,则入队,并标记(next_cur, False)为已访问。
      • 尝试向后跳next_cur = cur - b。前提是is_back == False(上次没向后跳)、位置合法、非禁止、且状态未访问,则入队,并标记(next_cur, True)为已访问。

代码实现 (Python)

from collections import deque class Solution: def minimumJumps(self, forbidden: List[int], a: int, b: int, x: int) -> int: """ :type forbidden: List[int] :type a: int :type b: int :type x: int :rtype: int """ if x == 0: return 0 # 将禁止列表转换为集合,便于O(1)查找 forbid_set = set(forbidden) # BFS搜索上界,6000是一个经验值,足以覆盖题目数据范围 MAX_BOUND = 6000 # 访问状态记录,使用(位置, 是否由向后跳抵达)作为键 visited = set() # 队列元素: (当前位置, 是否由向后跳抵达, 当前步数) queue = deque() queue.append((0, False, 0)) visited.add((0, False)) while queue: cur_pos, is_back, steps = queue.popleft() # 尝试向前跳 next_pos = cur_pos + a # 检查位置是否合法:未出界、非禁止点、状态未访问 if 0 <= next_pos <= MAX_BOUND and next_pos not in forbid_set and (next_pos, False) not in visited: if next_pos == x: return steps + 1 visited.add((next_pos, False)) queue.append((next_pos, False, steps + 1)) # 尝试向后跳 (前提:上一次不是向后跳) if not is_back: next_pos = cur_pos - b # 检查位置是否合法:非负、非禁止点、状态未访问 if next_pos >= 0 and next_pos not in forbid_set and (next_pos, True) not in visited: if next_pos == x: return steps + 1 visited.add((next_pos, True)) queue.append((next_pos, True, steps + 1)) # BFS队列清空仍未找到目标,说明不可达 return -1

关键点与示例分析

为什么上界是 6000?
这是一个基于题目数据范围的工程经验值。题目中a, b, x均不超过 2000,forbidden长度不超过 1000。通过分析,最坏情况下需要探索的范围不会超过max(x, max(forbidden)) + a + b再乘以一个较小的系数,6000 是一个足够大且安全的边界,可以避免无限循环,同时不会引起不必要的性能开销。

状态(位置, 是否由向后跳抵达)的重要性
考虑以下场景:从位置p通过向前跳抵达位置q,和通过向后跳抵达位置q,这两种状态是不等价的。因为后者意味着下一次移动不能向后跳,而前者可以。因此,必须区分这两种情况,否则会丢失可行解或导致错误。

示例运行
以题目示例forbidden = [14,4,18,1,15], a = 3, b = 15, x = 9为例:

  1. 初始状态(0, False, 0)
  2. 从0向前跳3步到3,状态(3, False, 1)
  3. 从3向前跳3步到6,状态(6, False, 2)
  4. 从6向前跳3步到9,发现9 == x,返回步数3
    程序输出结果为3,与示例一致。

关于一个“神奇BUG”的说明
在中,作者提到了一个在特定代码结构下returnbreak可能无法立即退出的情况。这通常与循环和条件判断的嵌套逻辑有关,并非语言本身的BUG。上述提供的代码结构清晰,在找到目标时立即返回steps + 1,可以正确退出。


参考来源

  • 【LeetCode】1654:到家的最少跳跃次数的解题思路 & 关于力扣无法return的BUG的讨论
  • LeetCode 题解 —— 1654. 到家的最少跳跃次数
  • Leetcode1654. 到家的最少跳跃次数(medium,BFS)
  • 1654. 到家的最少跳跃次数
  • Leetcode.1654 到家的最少跳跃次数
  • 【每日一题】1654. 到家的最少跳跃次数
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 0:31:28

Rainy MaTE:基于Rust与Tauri的本地优先AI代理开发平台深度解析

1. 项目概述&#xff1a;一个为开发者设计的本地优先AI代理驾驶舱如果你和我一样&#xff0c;对市面上那些要么完全在云端黑箱运行、要么权限管理松散的AI代理工具感到不安&#xff0c;同时又渴望一个能在自己电脑上真正“干活”的智能助手&#xff0c;那么Rainy MaTE的出现绝对…

作者头像 李华
网站建设 2026/5/10 0:30:55

AI文化遗产保护:应对数据偏见与构建公平数字化框架

1. 项目概述&#xff1a;当AI遇见非洲文化&#xff0c;一场关于“看见”与“被看见”的数字对话最近几年&#xff0c;我参与和观察了不少利用人工智能进行文化遗产数字化的项目&#xff0c;从欧洲的博物馆到亚洲的古迹&#xff0c;技术方案日趋成熟。但当我将目光投向非洲大陆时…

作者头像 李华
网站建设 2026/5/10 0:30:43

联合概率实战指南:从独立性检验到贝叶斯网络工程落地

1. 什么是联合概率&#xff1a;从天气预报到数据建模的真实逻辑你有没有注意过天气预报里那句“未来24小时有70%概率出现雷暴并伴随短时强降水”&#xff1f;这句话里藏着一个被很多人忽略却极其关键的统计学概念——联合概率。它不是在说“70%概率打雷”或“70%概率下暴雨”&a…

作者头像 李华
网站建设 2026/5/10 0:29:44

AIUI开源项目实战:基于Docker部署语音对话AI系统

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫AIUI。简单来说&#xff0c;它就是一个让你能和AI“打电话”的Web应用。你对着麦克风说话&#xff0c;它把你的语音转成文字发给GPT&#xff0c;再把GPT返回的文字用语音合成读出来&#xff0c;整个过程无…

作者头像 李华
网站建设 2026/5/10 0:20:46

CANN/metadef AppendStride函数

AppendStride 【免费下载链接】metadef Ascend Metadata Definition 项目地址: https://gitcode.com/cann/metadef 函数功能 向后扩展一个步长值&#xff0c;如果扩展的步长数量超出Stride的最大限制&#xff0c;那么本函数不做任何事情。 函数原型 Stride& Appe…

作者头像 李华
网站建设 2026/5/10 0:16:47

CANN/HCOMM内存导入API

HcommMemImport 【免费下载链接】hcomm HCOMM&#xff08;Huawei Communication&#xff09;是HCCL的通信基础库&#xff0c;提供通信域以及通信资源的管理能力。 项目地址: https://gitcode.com/cann/hcomm 产品支持情况 Ascend 950PR/Ascend 950DT&#xff1a;支持At…

作者头像 李华