Jump Game III

medium array breadth-first search graph

Problem

Given an array of non-negative integers arr and a starting index start, from index i you may jump to i + arr[i] or i - arr[i] (never outside the array). Return true if you can reach any index whose value is 0.

Inputarr = [4,2,3,0,3,1,2], start = 5
Outputtrue
5 → 4 → 1 → 3, and arr[3] = 0, so a zero is reachable.
Inputarr = [3,0,2,1,2], start = 2
Outputfalse
No sequence of jumps from index 2 ever lands on the zero at index 1.

def can_reach(arr, start):
    n = len(arr)
    queue = [start]
    seen = [False] * n
    seen[start] = True
    while queue:
        i = queue.pop(0)
        if arr[i] == 0:
            return True
        for nxt in (i + arr[i], i - arr[i]):
            if 0 <= nxt < n and not seen[nxt]:
                seen[nxt] = True
                queue.append(nxt)
    return False
function canReach(arr, start) {
  const n = arr.length;
  const queue = [start];
  const seen = new Array(n).fill(false);
  seen[start] = true;
  while (queue.length) {
    const i = queue.shift();
    if (arr[i] === 0) return true;
    for (const nxt of [i + arr[i], i - arr[i]]) {
      if (nxt >= 0 && nxt < n && !seen[nxt]) {
        seen[nxt] = true;
        queue.push(nxt);
      }
    }
  }
  return false;
}
boolean canReach(int[] arr, int start) {
    int n = arr.length;
    Deque<Integer> queue = new ArrayDeque<>();
    queue.add(start);
    boolean[] seen = new boolean[n];
    seen[start] = true;
    while (!queue.isEmpty()) {
        int i = queue.poll();
        if (arr[i] == 0) return true;
        for (int nxt : new int[]{i + arr[i], i - arr[i]}) {
            if (nxt >= 0 && nxt < n && !seen[nxt]) {
                seen[nxt] = true;
                queue.add(nxt);
            }
        }
    }
    return false;
}
bool canReach(vector<int>& arr, int start) {
    int n = arr.size();
    queue<int> q;
    q.push(start);
    vector<bool> seen(n, false);
    seen[start] = true;
    while (!q.empty()) {
        int i = q.front(); q.pop();
        if (arr[i] == 0) return true;
        for (int nxt : {i + arr[i], i - arr[i]}) {
            if (nxt >= 0 && nxt < n && !seen[nxt]) {
                seen[nxt] = true;
                q.push(nxt);
            }
        }
    }
    return false;
}
Time: O(n) Space: O(n)