当前位置: 首页 > 知识库问答 >
问题:

打印到达数组末尾所需的最小跳数序列

姜鸿
2023-03-14

我得到了一个值大于或等于0的整数数组,例如:[5,6,0,4,2,4,1,0,0,4]

我被要求实现一种算法,以从索引0开始的最短“跃点”数遍历数组,其中遍历定义如下:

-

如果我选择跳到索引3,它包含值4,我可以从我当前的索引(3)下一次跳到4个点-所以我现在考虑索引4到7作为序列中的下一步。

我的算法必须确定一个最小跳数解,但可以在具有相同跳数的解中任意选择。

对于本示例,以下内容将是有效输出:

0,5,9,出局

这是我的实现:

public class ArrayJumper {

    /**
     * @param args the command line arguments
     */
    int[] minJumps(int arr[], int n) {
        int jumps[] = new int[n];
        int tab[] = new int[n];// jumps[n-1] will hold the result
        int i, j;
        jumps[0] = 0;
        tab[0] = 0;

        if (n == 0 || arr[0] == 0) {
            return jumps;
        }

        // Find the minimum number of jumps to reach arr[i]
        // from arr[0], and assign this value to jumps[i]

        for (i = 1; i < n; i++) {
            jumps[i] = Integer.MAX_VALUE;
            for (j = 0; j < i; j++) {
                if (i <= j + arr[j] && jumps[j] != Integer.MAX_VALUE) {
                    if (jumps[i] >= jumps[j] + 1) {
                        jumps[i] = jumps[j] + 1;
                        tab[i] = j;
                        //break;
                    }
                }
            }
        }
        System.out.println(Arrays.toString(jumps));

        return tab;
    }

    public static void main(String[] args) {
        // TODO code application logic here
        int arr[] = {5, 6, 0, 4, 2, 4, 1, 0, 0, 4};
        //int arr[] = {2,3,1,1,2,4,2,0,1,1};
        int n = arr.length;
        int res[] = new int[n];
        int inn[] = new int[n];
        ArrayJumper a = new ArrayJumper();
        inn = a.minJumps(arr, n);
        System.out.println(Arrays.toString(inn));

        inn[0] = 0;
        String ans = " 0 ,";

        for (int i = 0; i < n - 1; i++) {
            if (inn[i] != inn[i + 1]) {
                ans = ans.concat(inn[i + 1] + ",");
            }
        }
        if (arr[inn[n - 1]] + inn[n - 1] == n - 1) {
            ans = ans.concat(n - 1 + ",");
        }

        ans = ans.concat("out");
        System.out.println(ans);
    }
}

然而,该解决方案适用于给定的输入,它对以下输出失败:{2,3,1,1,2,4,2,0,1,1};我不确定我错过了什么。两个注释的输入都可以正常工作,如果我分别更改了打破语句。那么我如何修改这个程序

0,1,4,5,9,输出用于输入{2,3,1,1,2,4,2,0,1,1}。

输入{5,6,0,4,2,4,1,0,0,4}

共有1个答案

柯良骏
2023-03-14

我相信您的minJumps()工作正常。您的问题在于答案的构造,ans字符串。

我不明白你试图这样做的逻辑。我相信你需要从“out”向后构建字符串。当inn[3]等于2时,这意味着如果您的解决方案通过输入的索引3,它应该在3之前通过索引2。但是你还不知道解决方案是否会跳过索引3。

所以要向后构建它,你从“out”开始,在“out”之前是什么?为了说明这一点,您需要将结果数组延长一个元素,以便新的最后一个元素告诉您在“out”之前要访问的最后一个索引。然后你可以做:

    String ans = "out";
    int index = n;
    while (index > 0) {
        index = inn[index];
        ans = "" + index + ", " + ans;
    }
    System.out.println(ans);

要构建数组,一个元素只需对方法进行一些简单的更改:

    int jumps[] = new int[n + 1];
    int tab[] = new int[n + 1];// jumps[n-1] will hold the result

    for (i = 1; i <= n; i++) {

通过这些更改,输入{5,6,0,4,2,4,1,0,0,4}将产生

0, 5, 9, out

输入{2,3,1,1,2,4,2,0,1,1}给出

0, 1, 4, 5, 9, out
 类似资料:
  • 问题是获取和数组中相应的索引,这些索引导致以较小的跳跃结束。例如:将需要s... 我说的跳跃是指跳跃;i、 e需要多少啤酒花。如果您是一个特定的索引,则可以通过该索引中的值进行跳跃。 下面是我在中的实现,它正确地给出了最小的跳转次数,但是我很难用

  • 我有一个“使用递归到达数组末尾的最小跳跃次数”的代码。但我无法打印序列。(vector vec中没有可打印的内容) 如有任何帮助,将不胜感激。 说明: 我想以最小跳跃从数组的第一个元素(即2)到达最后一个元素(即4) 跳转的方式: 第一个元素是2。这意味着我最多可以在阵列中进行2次跳跃。如果我跳第一步,那么我可以跳到第二个元素(即3),或者如果我跳第二步,那么我可以跳到第三个元素(即1) 第二个元

  • 我试图理解一个Python解决方案,它似乎使用了动态编程。我能够遵循大部分解决方案,但我正在努力使解决方案真正正规化。 问题陈述如下: 您将获得一个整数数组。从某个起始索引,您可以进行一系列跳转。(第一、第三、第五……)序列中的跳转称为“奇数”编号跳转,以及(第2、第4、第6、…)序列中的跳转称为偶数跳转。 你可以从index跳转到index j(with

  • 给定一个整数数组,其中每个元素表示可以从该元素向前执行的最大步数。编写一个函数,返回到达数组末尾(从第一个元素开始)的最小跳转次数。如果元素为0,则无法在该元素中移动。 输入: arr[] = { 1, 3, 5, 8, 9, 2, 6, 7, 6, 8, 9} 输出: 3(1- 发现了从动态规划方法到其他线性方法的多种方法。我无法理解所谓的时间线性方法。这里是一个链接,其中提出了一种线性方法。

  • 给定一个数组,从第一个元素开始验证到达终点需要多少步。 示例:arr=[1,3,5,8,4,2,6,7,0,7,9] 1- 3个步骤。 到目前为止,我从极客那里得到了以下代码: 但是我想打印出哪些数字是最短的路径(1-3-8)。我如何调整代码来做到这一点? 我试图创建一个j的列表,但是由于5在循环中进行了测试,所以也添加了它。 问题的链接:https://www.geeksforgeeks.org

  • 我处理下面提供的一个可编码性问题, 斐波那契序列使用以下递归公式定义: 一只小青蛙想去河的对岸。青蛙最初位于河的一边(位置−1),想要到达另一边(位置N)。青蛙可以跳过任何距离F(K),其中F(K)是第K个斐波那契数。幸运的是,河上有许多树叶,青蛙可以在树叶之间跳跃,但只能在N号位置的岸边方向跳跃。 河上的叶子用一个由N个整数组成的数组表示。数组A的连续元素表示从0到N的连续位置− 1在河上。阵列