Java 中的最小成本路径问题2025年3月17日 | 阅读 12 分钟 Java 中的最小成本路径问题是面试中被问到最多的问题之一。在这个问题中,会提供一个矩阵(costMatrix[][]),该矩阵表示 costMatrix[][] 中每个单元格的成本。任务是从左上角走到右下角,使得成本最小。我们需要返回最小成本。从一个单元格移动到另一个单元格的规则是,一次只能向左、向下或斜对角方向移动一个单元格。例如,从当前单元格 costMatrix[x][y],我们只能移动到以下单元格之一:costMatrix[x][y + 1](向左方向)、costMatrix[x + 1][y](向下方向)和 costMatrix[x + 1][y + 1](斜对角方向)。 例如,在以下矩阵中 ![]() 从左上角单元格(成本为 1)到右下角单元格(成本为 7)有以下几种路径。 1 -> 6 -> 9 -> 5 -> 7 Total Cost = 1 + 6 + 9 + 5 + 7 = 28 1 -> 6 -> 15 -> 5 -> 7 Total Cost = 1 + 6 + 15 + 5 + 7 = 34 1 -> 6 -> 15 -> 3 -> 7 Total Cost = 1 + 6 + 15 + 3 + 7 = 32 1 -> 6 -> 15 -> 7 Total Cost = 1 + 6 + 15 + 7 = 29 1 -> 6 -> 5 -> 7 Total Cost = 1 + 6 + 5 + 7 = 19 1 -> 2 -> 15 -> 3 -> 7 Total Cost = 1 + 2 + 15 + 3 + 7 = 28 1 -> 2 -> 15 -> 5 -> 7 Total Cost = 1 + 2 + 15 + 5 + 7 = 30 1 -> 2 -> 15 -> 7 Total Cost = 1 + 2 + 15 + 7 = 25 1 -> 2 -> 2 -> 3 -> 7 Total Cost = 1 + 2 + 2 + 3 + 7 = 15 1 -> 2 -> 3 -> 7 Total Cost = 1 + 2 + 3 + 7 = 13 在上述所有路径中,最后一条路径(1 -> 2 -> 3 -> 7,总成本:13)的成本最低。因此,13 是上述矩阵的所需答案。 注意:假设矩阵中任何单元格的成本始终是非负的。方法有两种方法可以解决这个问题:一种是递归方法,另一种是迭代方法(使用动态规划)。让我们从递归方法开始。 实现:递归递归方法也是暴力方法。在这种方法中,我们将遍历所有路径,并在这些路径中选择成本最低的路径。请看下面的程序。 文件名: MinCostPath.java 输出 For the following matrix: 1 2 2 6 15 3 9 5 7 The minimum cost path from the top-left to the bottom-right is: 13 For the following matrix: 10 12 20 16 5 13 19 50 17 The minimum cost path from the top-left to the bottom-right is: 32 复杂度分析:在上述程序中,一次递归调用会产生三次递归调用。因此,上述程序的 time complexity 是指数级的。指数级 time complexity 很大,在处理大量数据时应避免。因此,应该进行优化以降低 time complexity。 如果我们观察上面的程序,我们会发现有许多子问题被计算了多次,这导致了指数级的 time complexity。请看以下内容。 我们看到 minCostPath(1, 1) 出现了多次。因此,我们需要多次计算 minCostPath(1, 1) 的值。如果我们进一步扩展递归调用,我们会发现许多递归调用是多余的,应该避免。下面的程序展示了如何避免重复的递归调用。它使用了带有记忆化技术的递归。 文件名: MinCostPath1.java 输出 For the following matrix: 1 2 2 6 15 3 9 5 7 The minimum cost path from the top-left to the bottom-right is: 13 For the following matrix: 10 12 20 16 5 13 19 50 17 The minimum cost path from the top-left to the bottom-right is: 32 复杂度分析:在上述程序中,一次递归调用也会产生三次递归调用。然而,并非每次递归调用都会执行到底。由于我们避免了重复子问题的计算;因此,上述程序的 time complexity 大约为 O(row * column),其中 row 和 column 是 cost matrix 的行数和列数,这需要一些额外的空间。使用的额外空间为 O(row * column)。 实现:迭代在这种方法中,我们将使用动态规划来解决最小成本路径问题。请看下面的程序。 文件名: MinCostPath2.java 输出 For the following matrix: 1 2 2 6 15 3 9 5 7 The minimum cost path from the top-left to the bottom-right is: 13 For the following matrix: 10 12 20 16 5 13 19 50 17 The minimum cost path from the top-left to the bottom-right is: 32 复杂度分析:在上述程序中,有许多单 for 循环。然而,还有一个二重 for 循环。因此,上述程序的 time complexity 为 O(row * column),其中 row 是输入数组中的总行数,column 是输入数组的列数。此外,程序使用了一些额外的空间(一个二维数组:totalCost[][]),这使得程序的 space complexity 为 O(row * column)。 请注意,如果允许修改输入数组,那么我们可以放弃二维数组(totalCost[][])以将程序的 space complexity 降低到 O(1)。程序的 time complexity 保持不变。下面的程序展示了这一点。 文件名: MinCostPath3.java 输出 For the following matrix: 1 2 2 6 15 3 9 5 7 The minimum cost path from the top-left to the bottom-right is: 13 For the following matrix: 10 12 20 16 5 13 19 50 17 The minimum cost path from the top-left to the bottom-right is: 32 |
开发人员或程序员面临的常见错误之一是 Java 中的不可达代码错误。当 Java 中无法执行一个或多个语句时,就会发生不可达代码错误。例如,如果我们编写了一个语句,其后...
阅读 3 分钟
在本教程中,我们将讨论 Java 中不匹配的位数问题。在这个问题中,给出了两个数字(f1 和 f2)。我们的任务是比较这两个数字的二进制表示时,找出不匹配的位数...
11 分钟阅读
在 Java 程序中使用 JavaBeans 允许我们将许多对象封装到一个称为 Bean 的单个对象中。Java 是一种面向对象的编程语言,它使得“一次开发,随处运行和重用”变得最为重要。然而,JavaBeans 通过… 为 Java 程序增加了可重用性。
阅读 2 分钟
在编程中,我们通常需要实现只有两个值之一(真或假)的值。为此,Java 提供了一种特殊的数据类型,即布尔类型 (boolean),它可以取 true 或 false 的值。布尔值可以通过...
阅读 2 分钟
java.nio.DoubleBuffer 包含 hasArray() 函数。DoubleBuffer 类用于验证提供的缓冲区是否由可访问的浮点数组支持。如果可以访问该缓冲区的后备数组,它将返回 true;否则,它将返回 false。array() 和 arrayOffset()...
阅读 3 分钟
在 Java 中,箭头运算符用于创建 lambda 表达式。它随着 Java 8 中 lambda 表达式功能的添加而被引入。它将表达式主体与参数分开。Lambda 表达式通过消除...使函数式编程成为可能。
阅读 8 分钟
通过交换行来排列二进制网格,使其交换次数最少,这是一个令人兴奋的问题,它需要将给定的二进制网格转换为特定形式。目标是确保网格中的每行 i 都至少...
阅读 31 分钟
Shunting-yard 算法是计算机科学中一种常用的算法,用于将中缀表达式转换为后缀或前缀表达式。在后缀表示法(也称为逆波兰表示法,RPN)中,运算符放在操作数之后,而在前缀表示法(也称为波兰表示法….
阅读 8 分钟
java.text 中的内置方法之一是 getMaximumIntegerDigits()。Java 的 DecimalFormat 类用于确定数字整数部分可以包含的最大位数。数字中出现在小数点 (.) 之前的部分称为...
阅读 2 分钟
在 Java 中,多态性是面向对象编程的一个概念,它允许我们以不同的形式执行单个操作。在本节中,我们将仅讨论 Java 中的动态多态性。多态性“多态性”一词是由两个词组合而成的,即 ploy 和 morphs。即...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India