0%

1306. 跳跃游戏 III

1306.跳跃游戏 III

题目描述:

这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]

请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。

注意,不管是什么情况下,你都无法跳到数组之外。

数据范围:

$1\le arr.len \le 5 \times 10^4$

题解:

因为这个题目是只能跳到前后的两个位置,而不是之前的一段区间了,因此不能像之前那样做了。这个比较明显直接使用搜索。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
auto optimize_cpp_stdio = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
class Solution
{
public:
const static int maxn = 1e5 + 10;
const static int maxm = 1e5 + 10;
const static long long mod = 1e9 + 7;
const long long INF_LL = 0x3f3f3f3f3f3f3f3f;
const int INF = 0x3f3f3f3f;
bool canReach(vector<int> &arr, int start)
{
queue<int> q;
int n = arr.size();
vector<bool> vis(n);
vis[start] = true;
q.push(start);
while (q.size())
{
auto index = q.front();
q.pop();
if (arr[index] == 0)
return true;
if (index - arr[index] >= 0 && vis[index - arr[index]] == false)
{
q.push(index - arr[index]);
vis[index - arr[index]] = true;
}
if (index + arr[index] < n && vis[index + arr[index]] == false)
{
q.push(index + arr[index]);
vis[index + arr[index]] = true;
}
}
return false;
}
};