Leetcode-1306-跳跃游戏III

Leecode-1306-Jump Game III

思路:深度优先遍历/DFS

题目描述

  • 这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。

  • 当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]

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

示例:

1
2
3
4
5
6
输入:arr = [4,2,3,0,3,1,2], start = 5
输出:true
解释:
到达值为 0 的下标 3 有以下可能方案:
下标 5 -> 下标 4 -> 下标 1 -> 下标 3
下标 5 -> 下标 6 -> 下标 4 -> 下标 1 -> 下标 3
1
2
3
4
5
输入:arr = [4,2,3,0,3,1,2], start = 0
输出:true
解释:
到达值为 0 的下标 3 有以下可能方案:
下标 0 -> 下标 4 -> 下标 1 -> 下标 3
1
2
3
输入:arr = [3,0,2,1,2], start = 2
输出:false
解释:无法到达值为 0 的下标 1 处。

Solution:DFS

  • 初始化一个长度为arr的boolean数组,记录已访问过的位置
  • 递归进入判断当前位置是否是0
    • 不是的话:处理start左边的元素(索引递减,往左走找0);处理start右边的元素(索引递增,往右走找0), 最后还找不到的话返回false
    • 是的话:返回true

Java

Solution :

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
class Solution{
public boolean canReach(int[] arr, int start){
// 初始化一个长度为arr的boolean数组,记录已访问过的位置
boolean[] visited = new boolean[arr.length];

// 深度优先遍历
return dfs(arr,start,visited);
}

private boolean dfs(int[] arr, int start, boolean[] visited) {
// 递归进入判断当前位置是否是0
if (arr[start] == 0){
return true;
}

// 记录start位置已被访问
visited[start] = true;

// 处理start左边的元素(索引递减,往左走找0)
int left = start - arr[start];
if (left >= 0 && !visited[left] && dfs(arr,left,visited)){
return true;
}

// 处理start右边的元素(索引递增,往右走找0)
int right = start + arr[start];
if (right < arr.length && !visited[right] && dfs(arr,right,visited)){
return true;
}

// 没有能达到0的位置
return false;
}
}
  • 时间复杂度:O(n) n是数组的长度

  • 空间复杂度:O(n) boolean数组的长度

Python

Solution :

1
2


打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信