返回
勇闯代码海洋:LeetCode 1306 跳跃游戏 III 指南
前端
2023-12-04 09:01:37
简介
在这趟代码冒险中,我们将征服 LeetCode 1306 题:跳跃游戏 III。这趟旅程将考验你的敏捷思维和算法技能。做好准备,踏上探索未知的征程!
LeetCode 1306 题给出了一个非负整数数组 arr,它代表着一条数轴上的位置。你站在起始位置 start,你的目标是到达数组的最后一个位置。然而,你每次只能向右跳跃一定数量的步数,该步数由数组中的值决定。
例如,如果 arr = [3,4,2,1,2,3,7] 且 start = 0,那么你可以先跳跃 3 步到达位置 3,再跳跃 4 步到达位置 7,最后再跳跃 3 步到达数组的末尾。
你的任务是确定你是否能到达数组的最后一个位置。
算法策略
为了解决此问题,我们将采用广度优先搜索 (BFS) 算法。BFS 是一种逐层探索图或树的算法,非常适合解决这类问题,因为它可以保证我们找到从起始位置到最后一个位置的最短路径(如果存在的话)。
我们的 BFS 算法如下:
- 将起始位置 start 入队。
- 当队列不为空时,执行以下步骤:
- 从队列中出队一个位置 curr。
- 检查 curr 是否等于数组的最后一个位置。如果是,则返回 True。
- 否则,对于从 curr 出发的所有有效跳跃距离 d,将 curr + d 入队。
- 如果队列变为空,则返回 False。
代码实现
以下是一些用不同编程语言实现的代码示例:
C++
class Solution {
public:
bool canReach(vector<int>& arr, int start) {
queue<int> q;
q.push(start);
while (!q.empty()) {
int curr = q.front();
q.pop();
if (curr == arr.size() - 1) return true;
for (int i = arr[curr]; i >= 1; i--) {
if (curr + i < arr.size() && arr[curr + i] != -1) {
q.push(curr + i);
arr[curr + i] = -1; // 标记已访问
}
}
}
return false;
}
};
Java
class Solution {
public boolean canReach(int[] arr, int start) {
Queue<Integer> q = new LinkedList<>();
q.offer(start);
while (!q.isEmpty()) {
int curr = q.poll();
if (curr == arr.length - 1) return true;
for (int i = arr[curr]; i >= 1; i--) {
int next = curr + i;
if (next < arr.length && arr[next] != -1) {
q.offer(next);
arr[next] = -1; // 标记已访问
}
}
}
return false;
}
}
Python
class Solution:
def canReach(self, arr: List[int], start: int) -> bool:
queue = [start]
while queue:
curr = queue.pop(0)
if curr == len(arr) - 1: return True
for i in range(arr[curr], 0, -1):
next = curr + i
if next < len(arr) and arr[next] != -1:
queue.append(next)
arr[next] = -1 # 标记已访问
return False
总结
通过采用 BFS 算法,我们能够有效地解决 LeetCode 1306 题:跳跃游戏 III。该算法可以找到从起始位置到最后一个位置的最短路径,或确定该路径不存在。这趟算法之旅不仅锻炼了我们的编程技能,还让我们对 BFS 算法的强大功能有了更深入的理解。