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

这道题算是我第一次独自用递归写出深度优先搜索并解决的第一道题,感觉这段时间刷题有了回报,挺好玩的。

这道题既可以用广度优先搜索,也可以用深度优先搜索。这里用的是深度优先搜索,广度优先以后有机会了补上。

深度优先搜索利用递归可以比较简洁地实现。

如果某个点无法到达题目要求的数值为0的点,则说明这条点的路径都无法到达。可以利用这一点来跳出递归。

需要注意的是形成一个闭环的情况,会导致一直循环而最后栈溢出。

可以利用一个辅助空间来存储是否已经经过了。

刚开始我利用了一个set型变量,每经过一个点,就把这个点存储在set中,如果下次再经过这个点,则返回FALSE。

之后用了一个boolean数组进行了优化。

两次代码如下:

class Solution {
private int len;
private Set<Integer> set = new HashSet<>();
public boolean canReach(int[] arr, int start) {
this.len = arr.length;
if (set.contains(start)) {
return false;
} else {
set.add(start);
}
if (arr[start] == 0) {
return true;
}
int tem1 = start - arr[start];
boolean j1 = false;
if (tem1 >= 0) {
j1 = canReach (arr, tem1);
}
int tem2 = arr[start] + start;
boolean j2 = false;
if (tem2 < len) {
j2 = canReach (arr, tem2);
}
return j1 || j2;
}
}

运行结果:

优化后代码:

class Solution {
public boolean canReach(int[] arr, int start) {
int len = arr.length;
boolean[] judge = new boolean[len];
return tool(arr, start, judge, len);
}
private boolean tool (int[] arr, int start, boolean[] judge, int len) { if (judge[start]) {
return false;
} else {
judge[start] = true;
}
if (arr[start] == 0) {
return true;
}
int tem1 = start - arr[start];
boolean j1 = false;
if (tem1 >= 0) {
j1 = tool (arr, tem1, judge, len);
}
int tem2 = arr[start] + start;
boolean j2 = false;
if (tem2 < len) {
j2 = tool (arr, tem2, judge, len);
}
return j1 || j2;
}
}

力扣---1306. 跳跃游戏 III的更多相关文章

  1. 【力扣】337. 打家劫舍 III

    在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为"根". 除了"根"之外,每栋房子有且只有一个" ...

  2. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  3. Leetcode力扣45题 跳跃游戏 II

    原题目: 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: ...

  4. 力扣Leetcode 55. 跳跃游戏

    跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...

  5. 刷题-力扣-337. 打家劫舍 III

    337. 打家劫舍 III 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-iii 著作权归领扣网络所有.商 ...

  6. 【力扣】123. 买卖股票的最佳时机 III

    给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的 ...

  7. LeetCode 45跳跃游戏&46全排列

    原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...

  8. LeetCode(45): 跳跃游戏 II

    Hard! 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...

  9. 【1】【经典回溯、动态规划、贪心】【leetcode-55】跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4]输出: true解释 ...

  10. leetcode-45.跳跃游戏II(hard)

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4]输出 ...

随机推荐

  1. 【题解】CF991C Candies

    题面传送门 解决思路 看到 \(10^{18}\) 的范围,我们可以想到二分答案.只要对于每一个二分出的答案进行 \(check\) ,如果可行就往比它小的半边找,不可行就往比它大的半边找. 以下是 ...

  2. Bitmap和byte[]的相互转换

    /// <summary> /// 将Bitmap转换为字节数组 /// </summary> /// <param name="width"> ...

  3. Go语言核心36讲01

    你好,我是郝林,今天我分享的内容是:0基础的你,如何开始入门学习Go语言. 1. 你需要遵循怎样的学习路径来学习Go语言? 我们发现,订阅本专栏的同学们都在非常积极的学习和讨论,这让我们非常欣慰,并且 ...

  4. 决策树(二):后剪枝,连续值处理,数据加载器:DataLoader和模型评估

    在上一篇文章中,我们实现了树的构造,在下面的内容中,我们将中心放在以下几个方面 1.剪枝 2.连续值处理 3.数据加载器:DataLoader 4.模型评估 一,后剪枝 • 为什么剪枝  –" ...

  5. (C++) std::move std::forward及使用

    概念 std::ref :针对std::thread,需要把实参显式转换为引用类型: std::move :无条件把参数转换为右值:但是右值赋值给新变量时,实际还要看是否满足右值条件,如const s ...

  6. python进阶(29)单例模式

    初识单例模式 单例模式含义 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整 ...

  7. 【SQL进阶】【表默认值、自增、修改表列名、列顺序】Day02:表与索引操作

    一.表的创建.修改与删除 1.创建一张新表 [设置日期默认值.设置id自增] [注意有备注添加备注COMMENT] CREATE TABLE user_info_vip( id int(11) pri ...

  8. ArcObjects SDK开发 011 RasterLayer

    1.RasterLayer的结构 图层的话,除了FeatureLayer外,用的最多的就是RasterLayer了.较FeatureLayer而言,RasterLayer比较简单,这点可以从栅格图层的 ...

  9. Python requests 上传文件(以上传图片为例)

    from requests_toolbelt import MultipartEncoderimport requests encoderl = MultipartEncoder( fields = ...

  10. Jmeter 之在linux中监控Memory、CPU、I/O资源等操作方法

    在做性能测试时,单纯的只看响应时间.错误率.中间值远远不够的,有时需要监控服务cpu.内存等指标来判断影响性能的瓶颈在哪. 操作步骤: 一.Linux下配置jmeter环境 1.在linux环境下安装 ...