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

检查数组中是否有一个路径,其和在java中是递归求和

颛孙高义
2023-03-14

我正在尝试编写下一个程序:

仅包含正整数的二维方形数组。每个单元格只能在路径上出现一次,编写一个递归布尔静态方法,该方法接受一个包含数字(大于零)和任何正和的二维mat数组作为参数,该方法作为与mat大小相同的二维数组的参数给出,该方法应检查数组中是否有一个和为和的路径。否则,将返回false值,并使用路径标记路径和和:最初,当路径数组作为参数传递时,其所有单元格在方法末尾包含和,如果mat数组和中有路径,则路径数组将在参与路径的单元格中包含1,在所有其他单元格中包含0。如果mat数组中没有此类路径,则路径数组应包含值0。如果有多条路径,则数组路径将包含其中一条路径。例如,给定阵列mat如下所示:

和4,则该方法返回true,路径数组可以是以下三个数组之一:

我试过:

public static boolean findSum(int i, int j, int mat[][], int sum, int path[][]){
    if(sum == 0) {
        return true;
    }else if(sum < 0) {
        return false;
    }else if (i < mat.length - 1 && findSum(i + 1, j, mat, sum - mat[i][j], path)) {
            path[i][j] = 1;
            return true;
    }else if (i < mat.length - 1 && findSum(i + 1, j, mat, sum, path))
            return true;
    else if (j < mat.length - 1 && findSum(i, j + 1, mat, sum - mat[i][j], path)) {
            path[i][j] = 1;
            return true;
    }else if (j < mat.length - 1 && findSum(i, j + 1, mat, sum, path))
            return true;
    return false;
}



public static boolean findSum (int mat[][], int sum, int path[][]){
    if(findSum(0,0, mat, sum, path)) {
        System.out.println(Arrays.deepToString(path));
        return true;
    }else {
        return false;
    }
}

我得到了:

1 | 0 | 0 | 0
1 | 0 | 0 | 0
1 | 0 | 0 | 0
0 | 0 | 0 | 0

问题是有两条路径的路径太长

共有1个答案

公孙俊弼
2023-03-14

假设您的算法在其他方面是正确的,我相信您传递的2D路径数组始终引用相同的数组。因此,当一个元素被设置为1时,数组的后续用法将始终将该元素也设置为1。解决此问题的最简单方法是执行以下操作(未检查语法)

    int[][] tempPath= new int[path.length()][path[0].size()];

    tempPath= path;
 类似资料:
  • 我试图解决树中的一个问题,我们必须检查完整路径(从根到叶)是否会导致求和值(由用户给出)。我成功地做到了这一点,下面是代码 我理解代码的主要问题是,当我们向下移动的递归函数时,总和会发生变化,当总和在语句。我们希望在第二个函数中传递的总和值是那个给定点的值(由于总和通过第一个函数传递,应该会改变),但是这段代码似乎仍然正常工作。

  • 我得到了岩石的价格和数组中每一块岩石的值。我必须递归地(仅使用列出的4个变量)检查所有可能的岩石组合,以找到低于或等于岩石组合允许的最大重量的最高价格。 例如: 在这种情况下,可以找到的最高价格是50,因为20的重量低于25,值是50。这比5-10的权重高,5-10的权重也低于25,但它们的值加起来只有40,小于50。 示例2: 在这种情况下,最高价格是80美元。这是因为权重20 10加起来等于最

  • 我想知道我可以在给定的数组中计算2条特定路径吗。 > < li> 如何返回从[0][0]到[m][n]的最短(或最长)路径?我设法递归地遍历数组,但是我不知道如何“保存”路径并检查哪一个返回的路径更小。 第二个请求是一个我已经纠结了很长时间的问题,但我看到了关于使用和计算这些数组中的值的其他问题。

  • 本文向大家介绍检查它在C ++中是否是一个好的数组,包括了检查它在C ++中是否是一个好的数组的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个称为正整数的数组。我们必须选择一些数字子集,然后将每个元素乘以一个整数,然后将所有这些数字相加。如果我们可以通过任何可能的子集和被乘数从数组中得到1的和,则该数组将是一个很好的数组。 我们必须检查数组是否正确。 因此,如果输入类似于[12,23,7,

  • 问题内容: 我想为数组中的每个值返回一个布尔值,指示它是否在array中。我猜这应该是一个标准程序,但是我找不到有关如何执行此操作的任何信息。我的尝试如下: 但是,我得到了错误: 我使用的是numpy,因此首选使用numpy或标准Python的解决方案。 问题答案: 我相信您可以使用-

  • 问题内容: 我有两个数组,我想检查是否每个元素都在中。如果元素的值在中重复,则该元素的值必须相等。最好的方法是什么? 问题答案: 一种选择是对两个数组进行排序,然后遍历两个数组,然后比较元素。如果在超级袋中未找到子袋候选中的元素,则前者不是子袋。排序通常为O(n *log(n)),比较为O(max(s,t)),其中 s 和_t_是数组大小,总时间复杂度为O(m * log(m)) ,其中m =ma