LeetCode - 贪心 - 45. 跳跃游戏 Ⅲ

这里有一个非负整数数组 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

简单介绍:
难度:中等
使用语言:JAVA。
这道题来自leetcode题库的贪心算法标签。

解题思路:
首先看题、分析题意:

  1. 不能超出边界
  2. 每一步都有两种选择
  3. 可以用递归来解

既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题

数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
无特殊数据结构

算法:

  1. 设定好递归的结束条件
  2. 设定每一次递归的参数

代码:

class Solution {
    public boolean canReach(int[] arr, int start){
        return dfs(arr,start,0);
    }
    public static boolean dfs(int[] arr, int start, int steps){
        if(start < 0 || start >= arr.length) return false;
        if(steps == arr.length) return false;
        if(arr[start] == 0) return true;
        return dfs(arr, start + arr[start], steps+1) || dfs(arr,start - arr[start], steps + 1);
    }
}

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页