1345. 跳跃游戏 IV

题目描述

给一个数组arr,起点是0,终点是n-1
有3种选择:可以退一步、进一步、跳到值相等的位置
问跳到终点的最少操作次数?

f1 哈希表+bfs

基本分析

  1. 为什么是bfs?求从起点到终点的最短路
  2. 图是什么?当前节点到前、后、等值可跳的索引
  3. 怎么获取x到所有等值点索引y的映射关系?哈希表预处理
  4. 怎么保证等值跳一次后不再等值跳了?哈希表中删除x处的值

代码

class Solution:
def minJumps(self, arr: List[int]) -> int:
n = len(arr)
mp = defaultdict(list)
for i in range(n-1, -1, -1):
mp[arr[i]].append(i)
dist = [inf] * n
dist[0] = 0
q = deque([0])
while q:
x = q.popleft()
cnt = dist[x]
if x == n-1:
return cnt
for y in mp[arr[x]]:
if dist[y] == inf:
dist[y] = cnt + 1
q.append(y)
mp.pop(arr[x])
if dist[x+1] == inf:
dist[x + 1] = cnt + 1
q.append(x + 1)
if x > 0 and dist[x - 1] == inf:
dist[x - 1] = cnt + 1
q.append(x - 1)
return -1

总结

  1. 为了尽快出来,建立哈希表的时候有啥技巧?倒序遍历,最靠后地位置更早入队,如果最后位置是等值跳而来,能更早的出队?
f2 双向bfs
待完善
posted @   zhangk1988  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示