
2种解法 - 完成跳跃游戏
发布日期:2021-05-08 16:54:38
浏览次数:23
分类:精选文章
本文共 2956 字,大约阅读时间需要 9 分钟。
为了解决这个问题,我们需要找到从数组的第一个元素到最后一个元素的最少跳跃次数。每一步可以从当前位置跳到下一个位置(i+1),前一个位置(i-1),或者跳到与当前值相同的任一其他位置。
方法思路
我们可以使用双指针法来解决这个问题。双指针法通过记录每个数值的出现位置,来找到最少的跳跃次数。具体步骤如下:
字典记录位置:首先,我们创建一个字典,键是数组中的数值,值是该数值所有出现位置的列表。这样可以快速找到所有可能的跳跃目标。
初始化变量:使用一个布尔数组r
记录每个位置是否被访问过,队列来处理当前层的节点,记录当前层入队和出队的数量。
处理队列:从队列中取出当前节点,处理其所有可能的跳跃选项:
- 跳到i+1,如果i+1未被访问。
- 跳到i-1,如果i-1未被访问。
- 跳到所有满足条件的j位置。
优化处理:在处理j的位置时,优先处理后面的位置,以减少处理次数。
终点检查:当处理到终点位置时,返回当前跳跃次数。
这种方法确保了在最坏情况下也能高效处理,时间复杂度为O(n^2),但由于优化,实际效率较高。
解决代码
import java.util.*;public class Solution { public int MinJumps(int[] arr) { if (arr.length == 0) { return 0; } // 创建字典,键是数值,值是该数值出现的位置列表 Dictionary> dict = new Dictionary >(); for (int i = arr.length - 1; i >= 0; i--) { if (!dict.containsKey(arr[i])) { dict.Add(arr[i], new List ()); } dict[arr[i]].Add(i); } // 初始化数组r来记录访问状态,初始时只有位置0被访问 boolean[] r = new boolean[arr.length]; r[0] = true; // 初始化队列,并将起点加入队列 Queue q = new LinkedList<>(); q.add(0); int count = 0; int len = arr.length - 1; // 记录当前层的出队数和入队数 int outCount = 0; int inCount = 1; // 初始时,出队数为0,入队数为1(起点) while (!q.isEmpty()) { // 处理当前层的出队数 outCount = inCount; inCount = 0; while (outCount > 0) { int idx = q.Dequeue(); outCount--; // 检查i+1位置 if (idx + 1 < arr.length && !r[idx + 1]) { r[idx + 1] = true; q.add(idx + 1); inCount++; if (idx + 1 == len) { return count + 1; } } // 检查i-1位置 if (idx - 1 >= 0 && !r[idx - 1]) { r[idx - 1] = true; q.add(idx - 1); inCount++; if (idx - 1 == len) { return count + 1; } } // 检查所有j位置,满足arr[idx] == arr[j]且j != idx List positions = dict.get(arr[idx]); for (int j : positions) { if (j == idx) { continue; } if (!r[j]) { r[j] = true; q.add(j); inCount++; if (j == len) { return count + 1; } } } } // 处理下一个层次 count++; } return count; }}
代码解释
- 字典记录位置:字典
dict
记录了每个数值出现的位置,以便快速找到跳跃目标。 - 队列处理节点:队列
q
处理当前层的节点,确保每个节点只被处理一次。 - 跳跃处理:处理i+1、i-1和所有满足条件的j位置,确保所有可能的跳跃都被考虑。
- 优化处理:在处理j位置时,优先处理后面的位置,减少重复处理。
这种方法确保了在最少跳跃次数内到达数组的最后一个元素。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月25日 14时37分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux 2.6 驱动笔记(一)
2025-04-05
Linux 27岁了!这 27 件相关的有趣事实你可能不知道
2025-04-05
Linux 6 常用工具设置方法
2025-04-05
Linux 6 集群 日志,loganalyzer部署文档-(第一部分)
2025-04-05
linux 6.2yum问题
2025-04-05
linux abrt的用法
2025-04-05
Linux ACL权限管理
2025-04-05
linux ACL权限,设定,删除
2025-04-05
linux andorid studio创建快捷健
2025-04-05
Linux API的fork()测试
2025-04-05
linux awk命令详解
2025-04-05
linux awk命令详解2
2025-04-05
linux awk应用详解
2025-04-05
linux bash shell 特殊字符大全
2025-04-05
Linux Bash 脚本中的 IFS 是什么?
2025-04-05
linux bash: sqlplus: command not found 错误处理
2025-04-05
linux bash中too many arguments问题的解决方法
2025-04-05
Linux BASH多进程并行处理的方法实现
2025-04-05
linux bg和fg命令
2025-04-05