Java 中的矩阵最大和路径问题2025 年 1 月 6 日 | 阅读 9 分钟 这是顶级 IT 公司(如 **Google、Amazon、TCS、Accenture** 等)面试中经常遇到的问题。通过解决这个问题,可以考察应聘者的逻辑思维能力、批判性思维和解决问题的能力。因此,在本节中,我们将用不同的方法和逻辑来解决 **矩阵最大路径和问题**。我们还将为此创建 Java 程序。 问题陈述给定一个 n×m 的矩阵。在这个矩阵中,我们必须找到最大路径和。从左上角到右下角的移动是允许的。移动方向必须是向右、向下或向右对角线(从 (i, j) 到 (i+1, j)、(i, j+1) 或 (i+1, j+1))。 问题解决方案要找到最大路径和,我们必须找到矩阵第一行的最大值。将此值存储在 res 变量中。现在,对于矩阵中的每个元素,更新该元素为可以包含在 **最大路径** 中的最大值。如果该值大于 res 变量,则更新 res 变量。最后返回包含 **最大路径和值** 的 res 变量。 让我们通过一个例子来理解。 矩阵最大路径和示例输入矩阵 输出 500 解释 示例 2 输入矩阵 输出 3000 解释 示例 3 输入矩阵 输出 2300 解释 我们可以通过以下三种方法解决上述问题。
方法:使用递归矩阵最大路径和问题的朴素递归方法涉及递归地探索从矩阵顶部到底部的所有可能路径,计算最大和路径,而不利用记忆化来存储计算结果。 算法步骤 1: 定义一个具有 main 方法的 MatrixMaxSumPathNaive 类,用于初始化一个示例整数矩阵。 步骤 2: 创建一个 maxSumPath 方法,该方法接受一个二维整数数组 matrix 作为输入。确定矩阵的行数 rows 和列数 cols。通过调用 maxSumPathRecursive(matrix, 0, 0, rows, cols) 开始递归。 步骤 3: 定义一个私有静态方法 maxSumPathRecursive 来递归查找最大和路径。参数包括 matrix、当前行 current row、当前列 current col、总行数 total rows 和总列数 total cols。
步骤 4: 计算最大路径和,方法是:
步骤 5: 返回 maxPathSum,即从当前单元格找到的最大和路径。 步骤 6: 在 main 方法中调用 maxSumPath(matrix) 后,打印结果以显示使用朴素递归方法在矩阵中找到的最大和路径。 让我们在 Java 程序中实现上述步骤。 使用递归实现矩阵最大路径和问题文件名:MatrixMaxSumPathNaive.java 输出 Maximum sum path in the matrix (naive approach): 17 时间复杂度: 朴素递归方法的时间复杂度为 O(3^n),其中 n 是矩阵的行数。这是因为从每个单元格,函数可以移动到三个可能的方向(下、左下、右下),导致指数级的递归调用。 辅助空间: 辅助空间为 O(n),其中 n 是行数。空间由递归堆栈使用,在最坏情况下,递归的最大深度等于行数。 方法:动态规划动态规划是一种解决问题的技术,其中子问题的解决方案被存储和重用,以有效地解决问题的更大实例。它通过将复杂问题分解为更简单的重叠子问题来最优地解决它们,通常使用表格(记忆化)或自底向上的方法来迭代地构建解决方案。 算法步骤 1: 定义 MAX_SIZE 来表示矩阵的最大尺寸,并声明 numRows、numCols、matrix、dp 和 visited 数组。 步骤 2: 实现 inputMatrix() 来设置 numRows、numCols,并用值填充 matrix。 步骤 3: 定义 maximumSumPath(int row, int col) 来计算从单元格 (row, col) 的最大和路径。 步骤 4: 如果位于右下角,则返回其值。如果单元格已被访问,则从 dp 返回存储的值。将其标记为已访问,并将 visited[row][col] 设置为 1。 步骤 5: 初始化 totalSum。如果不在最后一行或最后一列,则计算从向右、向右对角线或向下移动的最大和。
步骤 6: 返回当前单元格更新后的最大和值。 步骤 7: 调用 inputMatrix()。调用 maximumSumPath(0, 0) 从左上角找到最大和路径,并打印结果。 让我们在 Java 程序中实现上述步骤。 使用动态规划实现矩阵最大路径和问题文件名:MatrixMaxSumPath.java 输出 Maximum sum path in the matrix: 29 时间复杂度: 时间复杂度为 O(n×m),因为由于记忆化,每个单元格最多只处理一次。 辅助空间: 辅助空间为 O(n×m),用于 dp 和 visited 数组。 方法:使用制表法在此方法中,使用动态规划 (DP) 表来迭代地计算从矩阵右下角到左上角的最大和路径。自底向上的方法通过增量构建解决方案来避免冗余计算并确保最优子结构。 算法步骤 1: 定义一个函数 maxSumPath(int[][] matrix) 来查找给定矩阵中的最大和路径。 步骤 2: 初始化变量 rows 和 cols 来存储矩阵中的行数和列数,并创建一个大小为 rows x cols 的二维数组 dp 来存储最大和。 步骤 3: 将 dp[rows - 1][cols - 1] 设置为 matrix[rows - 1][cols - 1],表示矩阵的右下角。 步骤 4: 遍历 dp 的最后一行和最后一列以计算最大和
步骤 5: 遍历 dp 表的其余部分,从右下角到左上角(i = rows - 2 到 0,j = cols - 2 到 0)
步骤 6: 从矩阵左上角开始的最大和路径存储在 dp[0][0] 中。 让我们在 Java 程序中实现上述步骤。 使用制表法实现矩阵最大路径和问题文件名:MatrixMaxSumPathTabulation.java 输出 Maximum sum path in the matrix (tabulation approach): 35 时间复杂度: 所提供代码的时间复杂度为 O(n×m),其中 n 是矩阵的行数,m 是矩阵的列数。这是因为矩阵中的每个单元格都恰好处理一次。 辅助空间: 所提供代码的辅助空间为 O(n×m),其中 n 是矩阵的行数,m 是矩阵的列数。这是因为需要为大小为 n×m 的动态规划表 (dp) 提供额外的空间。 下一个主题Java 中的方法和块同步 |
如何?在 Java 中打开文件是一项基本操作,可以通过 Java API 提供的各种类和方法来实现,这些类和方法适用于读取或写入等不同文件操作。对于读取文本文件,FileReader 类与 BufferedReader 结合可以高效地...
5 分钟阅读
问题描述 想象一下,您正在从一排相互连接的果树中采摘水果。每棵树结一种特定种类的水果。您有两篮,每篮可以无限容量地携带一种水果。您从任何...
阅读 6 分钟
在本节中,我们将学习如何创建一个 Java 程序来查找三个数字中的最大值。此外,我们还将学习如何使用三元运算符在 Java 中查找三个数字中的最大值。使用三元运算符 在继续学习程序之前,让我们……
阅读 3 分钟
与 C++ 一样,Java 也支持复制构造函数。但在 C++ 中,它是由默认创建的。在 Java 中,我们自己定义复制构造函数。构造函数 在 Java 中,构造函数与方法相同,但唯一的区别是构造函数与...的名称相同。
阅读 10 分钟
是什么? 是 Java Micro Edition 的缩写。它是用于嵌入式和移动设备(传感器、网关、手机、打印机、电视机顶盒)的可移植代码的开发和部署平台。它基于面向对象的 Java。它具有强大的用户界面,并且非常...
阅读 4 分钟
嵌套(nested)的英文意思是“在里面”。这意味着嵌套循环是包含在另一个循环语句中的循环语句。简单来说,循环内部的循环称为嵌套循环。内层循环在内层循环移到下一个之前会完全运行……
阅读 6 分钟
问题陈述 给定一个数学序列,其项如下:2, 12, 36, 80, 150, … 目标是通过推导其数学公式、以编程方式实现并验证其正确性来确定该序列的第 n 项。概述 分析序列...
阅读 4 分钟
每个人在处理编程时都会遇到错误。错误对开发人员来说很糟糕,因为很难处理。有些错误会导致困扰用户的故障。对于应用程序来说,两个最重要的考量是安全性和安全性。应用程序类型是什么并不重要...
阅读 4 分钟
当创建的对象无法更改时,Java 类就被认为具有不可变状态。对象的创建完成后,其状态永远不会改变。非共享的可变对象始终是线程安全的,这些对象是...
阅读 4 分钟
什么是标准名称?标准名称(canonical name)就是名称的标准形式。在 Java 中,标准名称是类名以及包名。它通常在 import 语句中使用。例如,java.lang.Character 是...的标准名称。
阅读 2 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India