1306. 跳跃游戏 III(BFS)
作者:互联网
1306. 跳跃游戏 III
这里有一个非负整数数组 arr
,你最开始位于该数组的起始下标 start
处。当你位于下标 i
处时,你可以跳到 i + arr[i]
或者 i - arr[i]
。
请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。
注意,不管是什么情况下,你都无法跳到数组之外。
示例 1:
输入:arr = [4,2,3,0,3,1,2], start = 5 输出:true 解释: 到达值为 0 的下标 3 有以下可能方案: 下标 5 -> 下标 4 -> 下标 1 -> 下标 3 下标 5 -> 下标 6 -> 下标 4 -> 下标 1 -> 下标 3
示例 2:
输入:arr = [4,2,3,0,3,1,2], start = 0 输出:true 解释: 到达值为 0 的下标 3 有以下可能方案: 下标 0 -> 下标 4 -> 下标 1 -> 下标 3
示例 3:
输入:arr = [3,0,2,1,2], start = 2 输出:false 解释:无法到达值为 0 的下标 1 处。
提示:
1 <= arr.length <= 5 * 10^4
0 <= arr[i] < arr.length
0 <= start < arr.length
1 class Solution { 2 public: 3 bool isInArea(int n, int index) { 4 return (index >= 0 && index < n); 5 } 6 bool canReach(vector<int>& arr, int start) { 7 int n = arr.size(); 8 // 题目中不会出现,增加保护 9 if (start >= n) { 10 return false; 11 } 12 if (n == 0) { 13 return false; 14 } 15 if (arr[start] == 0) { 16 return true; 17 } 18 19 vector<bool> visited(n, false); 20 queue<int> q; 21 q.push(start); 22 visited[start] = true; 23 while (!q.empty()) { 24 int curIndex = q.front(); 25 q.pop(); 26 // 向前和向后走 27 for (int i = -1; i < 2; i += 2) { 28 int nextIndex = curIndex + i * arr[curIndex]; 29 if (!isInArea(n, nextIndex) || visited[nextIndex]) { 30 continue; 31 } 32 if (arr[nextIndex] == 0) { 33 return true; 34 } 35 q.push(nextIndex); 36 visited[nextIndex] = true; 37 } 38 } 39 return false; 40 } 41 };
标签:1306,下标,int,arr,BFS,start,nextIndex,return,III 来源: https://www.cnblogs.com/MGFangel/p/16296784.html