计算青蛙到达河对岸所需的最少跳跃次数

2023-12-11

我正在处理下面提供的 Codility 问题,

斐波那契数列使用以下递归公式定义:

F(0) = 0
F(1) = 1
F(M) = F(M - 1) + F(M - 2) if M >= 2

一只小青蛙想要到河的对岸。青蛙最初位于河的一侧(位置-1)并想要到达另一侧(位置N)。青蛙可以跳过任意距离 F(K),其中 F(K) 是第 K 个斐波那契数。幸运的是,河上有很多树叶,青蛙可以在树叶之间跳跃,但只能在位置N的河岸方向跳跃。

河上的树叶用由 N 个整数组成的数组 A 表示。数组 A 的连续元素代表河牌圈上从 0 到 N − 1 的连续位置。数组 A 仅包含 0 和/或 1:

0代表没有叶子的位置; 1表示包含叶子的位置。 目标是计算青蛙可以到达河对岸(从位置 -1 到位置 N)的最少跳跃次数。青蛙可以在位置 -1 和 N(河岸)以及每个包含叶子的位置之间跳跃。

例如,考虑数组 A:

A[0] = 0
A[1] = 0
A[2] = 0
A[3] = 1
A[4] = 1
A[5] = 0
A[6] = 1
A[7] = 0
A[8] = 0
A[9] = 0
A[10] = 0

青蛙可以进行三次长度为 F(5) = 5、F(3) = 2 和 F(5) = 5 的跳跃。

写一个函数:

class Solution { public int solution(int[] A); }

给定一个由 N 个整数组成的数组 A,返回青蛙可以到达河对岸的最小跳跃次数。如果青蛙无法到达河的另一边,该函数应返回 -1。

例如,给定:

A[0] = 0
A[1] = 0
A[2] = 0
A[3] = 1
A[4] = 1
A[5] = 0
A[6] = 1
A[7] = 0
A[8] = 0
A[9] = 0
A[10] = 0

该函数应返回 3,如上所述。

假使,假设:

N 是范围内的整数[0..100,000]; 数组 A 的每个元素都是一个整数,可以具有以下值之一:0、1。 复杂:

预期最坏情况时间复杂度为O(N*log(N)); 预期最坏情况的空间复杂度是O(N)(不计算输入参数所需的存储空间)。

我写了以下解决方案,

class Solution {
    private class Jump {
        int position;
        int number;

        public int getPosition() {
            return position;
        }

        public int getNumber() {
            return number;
        }

        public Jump(int pos, int number) {
            this.position = pos;
            this.number = number;
        }
    }

    public int solution(int[] A) {

        int N = A.length;

        List<Integer> fibs = getFibonacciNumbers(N + 1);

        Stack<Jump> jumps = new Stack<>();
        jumps.push(new Jump(-1, 0));

        boolean[] visited = new boolean[N];

        while (!jumps.isEmpty()) {

            Jump jump = jumps.pop();

            int position = jump.getPosition();
            int number = jump.getNumber();

            for (int fib : fibs) {

                if (position + fib > N) {
                    break;
                } else if (position + fib == N) {
                    return number + 1;
                } else if (!visited[position + fib] && A[position + fib] == 1) {

                    visited[position + fib] = true;
                    jumps.add(new Jump(position + fib, number + 1));
                }
            }
        }

        return -1;
    }


    private List<Integer> getFibonacciNumbers(int N) {

        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < 2; i++) {
            list.add(i);
        }

        int i = 2;

        while (list.get(list.size() - 1) <= N) {

            list.add(i, (list.get(i - 1) + list.get(i - 2)));
            i++;
        }

        for (i = 0; i < 2; i++) {
            list.remove(i);
        }

        return list;
    }




    public static void main(String[] args) {

    int[] A = new int[11];

    A[0] = 0;
    A[1] = 0;
    A[2] = 0;
    A[3] = 1;
    A[4] = 1;
    A[5] = 0;
    A[6] = 1;
    A[7] = 0;
    A[8] = 0;
    A[9] = 0;
    A[10] = 0;

    System.out.println(solution(A));
   }
}

然而,虽然正确性看起来不错,但性能还不够高。代码中是否存在错误以及如何提高性能?

enter image description here


通过简单的 BFS 获得 100% 的结果:

public class Jump {
    int pos;
    int move;
    public Jump(int pos, int move) {
        this.pos = pos;
        this.move = move;
    }
}

public int solution(int[] A) {

    int n = A.length;
    List < Integer > fibs = fibArray(n + 1);
    Queue < Jump > positions = new LinkedList < Jump > ();
    boolean[] visited = new boolean[n + 1];

    if (A.length <= 2)
        return 1;

    for (int i = 0; i < fibs.size(); i++) {
        int initPos = fibs.get(i) - 1;
        if (A[initPos] == 0)
            continue;
        positions.add(new Jump(initPos, 1));
        visited[initPos] = true;
    }

    while (!positions.isEmpty()) {
        Jump jump = positions.remove();
        for (int j = fibs.size() - 1; j >= 0; j--) {
            int nextPos = jump.pos + fibs.get(j);
            if (nextPos == n)
                return jump.move + 1;
            else if (nextPos < n && A[nextPos] == 1 && !visited[nextPos]) {
                positions.add(new Jump(nextPos, jump.move + 1));
                visited[nextPos] = true;
            }
        }
    }


    return -1;
}


private List < Integer > fibArray(int n) {
    List < Integer > fibs = new ArrayList < > ();
    fibs.add(1);
    fibs.add(2);
    while (fibs.get(fibs.size() - 1) + fibs.get(fibs.size() - 2) <= n) {
        fibs.add(fibs.get(fibs.size() - 1) + fibs.get(fibs.size() - 2));
    }
    return fibs;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算青蛙到达河对岸所需的最少跳跃次数 的相关文章

  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • Cucumber DataTable 错误 - io.cucumber.datatable.UndefinedDataTableTypeException:无法将 DataTable 转换为 cucumber.api.DataTable

    尝试使用 cucumber selenium java intelliJ 运行场景 但在其中一个步骤中出现有关 DataTable 的错误 在我开始使用测试运行程序并更改周围的一些内容之前 数据表工作正常并正确转换该步骤的参数 但我就是无法
  • 如何将文件中的行读入数组?

    我正在尝试将文件作为行数组读入 然后使用 zsh 对其进行迭代 我得到的代码在大多数情况下都有效 除非输入文件包含某些字符 例如括号 这是它的一个片段 bin zsh LIST cat path to some file txt SIZE
  • Android 解析 JSON 卡在 get 任务上

    我正在尝试解析一些 JSON 数据 我的代码工作了一段时间 我不确定我改变了什么突然破坏了代码 当我运行代码时 我没有收到任何运行时错误或警告 我创建一个新的 AsyncTask 并执行它 当我打电话时 get 在这个新任务中 调试器在此行
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • 使用 HTTPServletRequestWrapper 包装请求参数

    我有一个可以验证 授权 REST 调用的过滤器 该过滤器需要访问请求参数 因此我为此编写了一个自定义 HTTPServletRequestWrapper import java util Collections import java ut
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 查找重叠间隔序列中最大和的算法

    我试图解决的问题在数轴上有一个间隔列表 每个间隔都有一个预定义的分数 我需要返回最大可能的总分 问题是间隔重叠 并且重叠间隔中我只能使用一个 这是一个例子 Intervals Score 0 5 15 4 9 18 10 15 12 8 2
  • 从 dask 数据框中的日期时间序列获取年份和星期?

    如果我有一个 Pandas 数据框和一个日期时间类型的列 我可以按如下方式获取年份 df year df date dt year 对于 dask 数据框 这是行不通的 如果我先计算 像这样 df year df date compute
  • Jackson 反序列化相当于 @JsonUnwrapped 吗?

    假设我有以下课程 public class Parent public int age JsonUnwrapped public Name name 生成 JSON age 18 first Joey last Sixpack 我如何将其反
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • knitr:块中的代码意外地被包装

    在使用 knit2pdf 和 LaTeX 的投影仪演示中 我有时 发现块中的代码被包装 即使我已经设置了tidy FALSE全球 例如 这个块 item Fit this using func glm lt
  • 保存到 CSV 时日期信息消失

    我试图从互联网上提取一些数据 然后将其导出到 CSV 文件 但我丢失了 CSV 文件中的日期信息 我不明白为什么 我是 R 新手 所以请保持简单的回答 这是我的代码 Library quantmod getSymbols SPY from
  • PHPUnit 测试双打

    我开始使用 PHPUnit 来测试我的代码 但我在理解双重测试方面遇到一些问题 我尝试存根类方法 b 以在从另一个方法调用时返回 true 而不是通常的行为 false 我有这样的代码 class MyClass function a re
  • 创建后数组大小发生变化

    谁能解释一下这里发生了什么 我的印象是 数组的大小一旦创建和声明就无法更改 public class ArrayManipulation public static void main String args int a 1 2 3 new
  • 解析 TO 标头中符合 RFC 822 的地址

    我想使用 preg match all 解析电子邮件地址列表 如 TO 标头中的列表 以获取用户名 如果存在 和电子邮件 与 Pear 中的 mailparse rfc822 parse addresses 或 Mail RFC822 pa
  • 返回 python 中最常出现的前 n 个字符及其各自的计数

    如何返回前 n 个最常出现的字符及其各自的计数 例如 aaaaaabbbbcccc 2应该返回 a 6 b 4 在Python中 我试过这个 def top chars input n list1 list input list3 list
  • 将重复参数传递给 Numpy 向量化函数的最佳方法

    所以 继续我和 TheBlackCat 的讨论这个答案 我想知道将参数传递给 Numpy 向量化函数的最佳方法 所讨论的函数定义如下 vect dist funct np vectorize lambda p1 p2 vincenty p1
  • 在jquery中向上/向下移动

    我有 5 个跨度 我试图在 jquery 中将它们向上 向下移动 交换位置 a href Up a a href Down a span Test1 span br span Test2 span br span Test3 span br
  • Fortran 2003 中参数化派生类型的问题

    我正在自学 Fortran 2003 以便将其用于我目前正在进行的一个研究项目 我已经习惯了 Fortran 90 但这个项目需要使用参数化类型 所以我要转向 2003 我正在关注这个网站的描述了如何定义参数化类型 并根据网站的示例编写了一
  • 处理 Google Play 服务更新消息

    我在我的应用程序中使用 googleservices 版本 8 3 但是 当我在旧设备 LG II Optimus 上下载应用程序时 它向我显示以下消息 除非您更新 Google Play 否则此应用程序将无法运行 服务 我接受并更新了谷歌
  • 使用 powershell 从 HTML 网站抓取图像链接

    我想批量下载一些图片库 这些图像是免费提供的 无需任何许可 我一生都无法让它发挥作用 这是我到目前为止所拥有的 pattern 吐出的是整个 HTML 行 而不仅仅是图像链接 有什么可以给我的指点吗 出于测试目的 该循环设置为仅运行一次 循
  • Oracle 透明数据加密未解密访问

    我可以按照以下所有陈述都成立的方式设置 Oracle 数据库吗 a 某些列 可能是所有列 都已加密 因此对数据库文件的直接文件访问将不允许攻击者检索任何记录 b 加密列对于授权用户透明地解密 其中授权发生 例如通过拥有一定的角色或特权 c
  • 重载一元运算符& 有哪些合理的理由?

    好吧 我已经受到启发去做一些头部冲孔 好像超载了operator 导致不小的疼痛 存在哪些合法的超载情况 不能说我曾经这样做过 我似乎记得类似智能指针类的东西 它覆盖了operator 因为它想要返回所包含指针的地址而不是智能指针对象的地址
  • 计算随机生成的数字列表中的频率

    我生成了 0 9 的 100 个随机数 我应该计算每个数字出现的次数 将其存储在 10 个整数的数组中并进行计数 这是我到目前为止所拥有的 我无法弄清楚计数部分 Random r new Random int integers new in
  • 对单词数组进行排序 - 非英文字母 + 双字符字母 PHP

    我想按字母顺序对单词数组进行排序 不幸的是 在我的语言 克罗地亚语 中 有双字符字母 例如 lj nj d 并且 php 未正确排序字母sort函数 例如 这是正确排序的克罗地亚字母表 还有一些英文字母 alphabet array a b
  • java中如何将图像转换为透明图像

    如何将图像的白色背景转换为透明背景 谁能告诉我该怎么做 谷歌的第一个结果是这样的 使颜色透明http www rgagnon com javadetails java 0265 html 它使图像的蓝色部分透明 但我确信您可以调整它以使用白
  • 如何将图库中的图像存储到 SQLite 数据库中

    我已经尝试使用此代码将图像从图库上传到我的应用程序中的 sqllite 数据库 但是当我的应用程序尝试打开图库时 它给出强制关闭错误 我不知道问题是什么 请帮助我并提前感谢 public class ImagggggggActivity e
  • 转换后的 mp4 h264 基线格式加载时间较长

    我已将视频转换为 mp4 x264 基线格式 并且它可以在所有 PC 手机上正常工作 问题是加载视频需要很长时间 而谷歌搜索发现 ffmpeg 会在视频的末尾处转换并设置索引文件因此它会加载到最后阅读 然后播放视频 因此任何缩短加载时间的建
  • Iterator 类和 foreach 构造之间的性能差异

    我正在运行以下代码 但有时在运行它时会出现某种并发异常 ArrayList
  • 计算青蛙到达河对岸所需的最少跳跃次数

    我正在处理下面提供的 Codility 问题 斐波那契数列使用以下递归公式定义 F 0 0 F 1 1 F M F M 1 F M 2 if M gt 2 一只小青蛙想要到河的对岸 青蛙最初位于河的一侧 位置 1 并想要到达另一侧 位置N