Given an array of non-negative integers arr, you are initially positioned at
start index of the array. When you are at index i, you can jump to i + arr[i] or i - arr[i], check if you can reach any index with value 0.
Notice that you can not jump outside of the array at any time.
Input: arr =[4,2,3,0,3,1,2], start =5Output: trueExplanation:
All possible ways to reach at index 3with value 0 are:index 5-> index 4-> index 1-> index 3index 5-> index 6-> index 4-> index 1-> index 3
Example 2:
1
2
3
4
Input: arr =[4,2,3,0,3,1,2], start =0Output: trueExplanation: One possible way to reach at index 3with value 0is:index 0-> index 4-> index 1-> index 3
Example 3:
1
2
3
Input: arr =[3,0,2,1,2], start =2Output: falseExplanation: There is no way to reach at index 1with value 0.
The problem can be visualized as a graph traversal where each index is a node, and you can jump to two possible nodes from each index. BFS is suitable because it explores all possible jumps level by level and avoids revisiting indices, ensuring we find a path to any zero efficiently.
classSolution {
public:bool canReach(vector<int>& arr, int start) {
int n = arr.size();
queue<int> q;
vector<bool> vis(n, false);
q.push(start);
vis[start] = true;
while (!q.empty()) {
int i = q.front(); q.pop();
if (arr[i] ==0) return true;
for (int d : {arr[i], -arr[i]}) {
int ni = i + d;
if (ni >=0&& ni < n &&!vis[ni]) {
q.push(ni);
vis[ni] = true;
}
}
}
return false;
}
};
classSolution {
publicbooleancanReach(int[] arr, int start) {
int n = arr.length;
Queue<Integer> q =new LinkedList<>();
boolean[] vis =newboolean[n];
q.offer(start);
vis[start]=true;
while (!q.isEmpty()) {
int i = q.poll();
if (arr[i]== 0) returntrue;
for (int d : newint[]{arr[i], -arr[i]}) {
int ni = i + d;
if (ni >= 0 && ni < n &&!vis[ni]) {
q.offer(ni);
vis[ni]=true;
}
}
}
returnfalse;
}
}
classSolution {
funcanReach(arr: IntArray, start: Int): Boolean {
val n = arr.size
val vis = BooleanArray(n)
val q: ArrayDeque<Int> = ArrayDeque()
q.add(start)
vis[start] = truewhile (q.isNotEmpty()) {
val i = q.removeFirst()
if (arr[i] ==0) returntruefor (d in listOf(arr[i], -arr[i])) {
val ni = i + d
if (ni in0 until n && !vis[ni]) {
q.add(ni)
vis[ni] = true }
}
}
returnfalse }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution:
defcanReach(self, arr: list[int], start: int) -> bool:
n = len(arr)
vis = [False] * n
q = [start]
vis[start] =Truewhile q:
i = q.pop(0)
if arr[i] ==0:
returnTruefor d in (arr[i], -arr[i]):
ni = i + d
if0<= ni < n andnot vis[ni]:
q.append(ni)
vis[ni] =TruereturnFalse