Efficiently Compute Sums of Diagonals of a Matrix in Java

2025年5月2日 | 阅读 4 分钟

高效计算矩阵的主对角线和副对角线之和,关键在于利用索引属性来最小化迭代次数。与使用嵌套循环遍历整个矩阵不同,单循环可以直接访问对角线元素,从而提高性能并简化代码。这种方法对于较大的方阵尤其有利,可以在保持代码清晰的同时实现最佳的时间复杂度。

示例 1

矩阵

主对角线元素 1, 5, 9

副对角线元素 3, 5, 7

主对角线之和 1+5+9=151 + 5 + 9 = 151+5+9=15

副对角线之和 3+5+7=153 + 5 + 7 = 153+5+7=15

暴力破解法

暴力破解法 是一种直接的方法,它在不进行优化的情况下检查问题的所有可能解或元素。它通常涉及遍历所有选项,使其简单但对于大型数据集可能效率低下。

算法

步骤 1: 初始化 矩阵,并设置两个变量 primaryDiagonalSum 和 secondaryDiagonalSum,都初始化为 0。

步骤 2: 通过使用 matrix.length 获取矩阵大小 n(假设矩阵是方的)。

步骤 3: 检查每个元素,判断它是否为主对角线 (i==j) 或副对角线 (i+j==n−1) 的一部分。

步骤 4: 在执行必要的检查后,通过加上各自的元素来更新 primaryDiagonalSum 和 secondaryDiagonalSum。

步骤 5: 循环结束后,打印出两个对角线之和的结果。

让我们在 Java 程序中实现上述算法。

文件名: MatrixDiagonalSum.java

输出

 
Primary Diagonal Sum: 15
Secondary Diagonal Sum: 15   

时间复杂度: O(N²), 因为嵌套循环遍历矩阵中的所有元素。

辅助空间: O(1), 只使用了用于求和的固定变量。

高效方法(使用单循环)

该代码使用单个循环同时计算主对角线和副对角线之和,将迭代次数最小化为 O(N)。它减少了冗余的遍历,确保了方阵两个对角线的高效计算。

算法

步骤 1: 定义一个具有整数元素的方阵 matrix。

步骤 2: 通过使用其长度来确定矩阵的行数或列数。

步骤 3: 创建两个 变量,primaryDiagonalSum 和 secondaryDiagonalSum,初始值为 0。它们将分别存储主对角线和副对角线的和。

步骤 4: 对于每个索引 i(从 0 到 n - 1)

  • 主对角线: 将 matrix[i][i] 的元素加到 primaryDiagonalSum。
  • 副对角线: 将 matrix[i][n - 1 - i] 的元素加到 secondaryDiagonalSum。

步骤 5: 显示 primaryDiagonalSum 作为主对角线之和,以及 secondaryDiagonalSum 作为副对角线之和。

让我们在一个 Java 程序中实现上述算法。

文件名: MatrixDiagonalSum.java

输出

 
Primary Diagonal Sum: 15
Secondary Diagonal Sum: 15   

时间复杂度: O(N), 因为只有一个循环遍历 N 个元素(对于大小为 N×NN \times NN×N 的方阵)。

辅助空间: O(1), 因为只使用了用于求和的固定变量。


下一个话题PermGen 空间 Java