假设我们有一个非负整数arr的数组,我们最初位于数组的起始索引处。当我们出现在索引i处时,我们可以跳转到i + arr [i]或i-arr [i],检查是否可以到达任何值为0的索引。我们要记住,我们不能跳到随时可以使用数组。因此,如果输入类似:arr = [4,2,3,0,3,1,2]并从5开始,则输出为true,因为移动5→4→1→3或5→6→ 4→1→3。
为了解决这个问题,我们将遵循以下步骤-
n:= arr的大小
定义队列q,将start插入q,定义一个称为visited的集合,并将start插入Visited的集合
当队列不为空时,
将curr-arr [curr]插入q
将curr-arr [curr]插入访问
将curr + arr [curr]插入q
将curr + arr [curr]插入访问
curr:= q的前元素,从q删除前元素
如果array [curr]为0,则返回true
如果curr + arr [curr] <n并且curr + arr [curr]不存在于访问集中,则
如果curr-arr [curr]> = 0并且curr-arr [curr]在访问集中不存在,则
返回假
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: bool canReach(vector<int>& arr, int start) { int n = arr.size(); queue <int> q; q.push(start); set <int> visited; visited.insert(start); while(!q.empty()){ int curr = q.front(); q.pop(); if(arr[curr] == 0)return true; if(curr + arr[curr] < n && !visited.count(curr + arr[curr])){ q.push(curr + arr[curr]); visited.insert(curr + arr[curr]); } if(curr - arr[curr] >= 0 && !visited.count(curr - arr[curr])){ q.push(curr - arr[curr]); visited.insert(curr - arr[curr]); } } return false; } }; main(){ vector<int> v = {4,2,3,0,3,1,2}; Solution ob; cout << (ob.canReach(v, 5)); }
[4,2,3,0,3,1,2] 5
输出结果
1