返回

勇闯代码海洋:LeetCode 1306 跳跃游戏 III 指南

前端

简介

在这趟代码冒险中,我们将征服 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 算法如下:

  1. 将起始位置 start 入队。
  2. 当队列不为空时,执行以下步骤:
    • 从队列中出队一个位置 curr。
    • 检查 curr 是否等于数组的最后一个位置。如果是,则返回 True。
    • 否则,对于从 curr 出发的所有有效跳跃距离 d,将 curr + d 入队。
  3. 如果队列变为空,则返回 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 算法的强大功能有了更深入的理解。