首页 > 其他分享 >力扣---1306. 跳跃游戏 III

力扣---1306. 跳跃游戏 III

时间:2023-01-25 01:44:21浏览次数:44  
标签:力扣 1306 下标 int arr len --- start boolean

这里有一个非负整数数组 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,下标,int,arr,len,---,start,boolean
From: https://www.cnblogs.com/allWu/p/17066615.html

相关文章

  • day01 - Linux基础命令
    1.操作系统介绍操作系统的作用:用来整合硬件系统资源常用操作系统: 1.DOS 2.Windows: a.win3.1,win3.2 b.win95 c.win97 d.windowsme e.window......
  • Day12 - 多任务编程【进程】
    0.多任务的概念多任务是指在同一时间内执行多个任务,例如:现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。1.多任务介绍多任务为提高程序的执行效......
  • day02 - Linux高级命令
    1.echo和重定向a.echo$?显示上一次命令或程序的执行状态码b.echo$PATH显示系统环境变量PATHa.>输出重定向,用来将输出到屏幕的数据,重定向到一个指定......
  • flex布局 -- 弹性盒模型
    flex布局--弹性盒模型display:flex;就会让其变成弹性盒子当把一个元素的display属性设置为flex或者inline-flex后,它就成了一个容器。flex与inline-flex......
  • 【最短路】Atcoder Beginner Contest 286----E
    题目:E-Souvenir(atcoder.jp)题解:首先这道题可以很容易看出来是求最短路。最开始自己是用bfs写的,出现了WA,TLE,RE等错误。因为对于每种情况会有Q次询问,如果每次询问都......
  • PyTorch图像分类全流程实战--迁移学习训练图像分类模型03
    教程同济子豪兄:https://space.bilibili.com/1900783斯坦福CS231N【迁移学习】中文精讲:https://www.bilibili.com/video/BV1K7411W7So斯坦福CS231N【迁移学习】官方笔记:h......
  • day09-AOP-02
    AOP-024.问题提出在上一篇的MyProxyProvider类中,我们的输出语句功能比较弱,在实际开发中,我们希望是以一个方法的形式,嵌入到真正执行的目标方法前,怎么办?1.使用土方法解决......
  • youtube-dl下载太慢了,我选yt-dlp
    前言最近过年嘛,过年前照例来下载一些贺岁歌曲,现在国内没啥人做贺岁专辑,这方面还得看马来西亚华人,他们每年都有出专辑,质量很不错!国内平台自然是没有(或者不全的),需要在YouTu......
  • ArcGIS工具 - 计算折点数量
    在GIS中,点构成线,线构成面,面构成体,维度增加,模型也加复杂。有时,我们需要统计线面等要素到底由多少个点构成,系统工具没有此功能,为源地理提供了三种解决方案。方法一折点转......
  • Vue 中 v-html 无法被 style scoped 渲染的问题
    假设有这么一个vue组件:<template><divv-html="docPreview"/></template><stylesrc="style.css"scoped></style>这样来说,div内的html的元素并不会受到c......