leetcode
leetcode 1401 ~ 1450
矩阵对角线元素的和

矩阵对角线元素的和

难度:

标签:

题目描述

给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。

请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。

 

示例  1:

输入:mat = [[1,2,3],
            [4,5,6],
            [7,8,9]]
输出:25
解释:对角线的和为:1 + 5 + 9 + 3 + 7 = 25
请注意,元素 mat[1][1] = 5 只会被计算一次。

示例  2:

输入:mat = [[1,1,1,1],
            [1,1,1,1],
            [1,1,1,1],
            [1,1,1,1]]
输出:8

示例 3:

输入:mat = [[5]]
输出:5

 

提示:

  • n == mat.length == mat[i].length
  • 1 <= n <= 100
  • 1 <= mat[i][j] <= 100

代码结果

运行时间: 19 ms, 内存: 16.3 MB


/*
 * 思路:
 * 1. 使用IntStream来生成索引。
 * 2. 根据索引计算主对角线和副对角线元素的和。
 * 3. 如果n是奇数,需要减去重复计算的中间元素。
 */
import java.util.stream.IntStream;

public class DiagonalSumStream {
    public static int diagonalSum(int[][] mat) {
        int n = mat.length;
        int sum = IntStream.range(0, n)
            .map(i -> mat[i][i] + mat[i][n - i - 1])
            .sum();
        // 如果n是奇数,中间元素被重复计算,减去一次
        if (n % 2 == 1) {
            sum -= mat[n / 2][n / 2];
        }
        return sum;
    }
}

解释

方法:

题解通过遍历矩阵的每一行来计算主对角线和副对角线上的元素之和。对于每一行,其主对角线上的元素位置是mat[i][i],而副对角线上的元素位置是mat[i][mat_len - 1 - i]。如果矩阵的维数n是奇数,中心的元素会被同时算在主对角线和副对角线上,因此需要将其减去一次以避免重复计算。如果n是偶数,则主对角线和副对角线没有交点,不会有重复计算的问题。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在计算矩阵对角线元素的和时,需要特别考虑矩阵维数是奇数的情况?
在奇数维数的矩阵中,主对角线和副对角线会在中心元素处交叉。这意味着中心的元素在计算时会被重复计算两次(一次作为主对角线的一部分,一次作为副对角线的一部分)。因此,为了确保每个元素只被计算一次,需要从总和中减去中心元素一次,以纠正这一重复计算的问题。
🦆
题解中提到,如果矩阵的维数n是偶数,则主对角线和副对角线没有交点。能否解释更多关于这一点的细节,例如为什么没有交点?
在偶数维数的矩阵中,主对角线和副对角线不会在任何单一元素上相交。这是因为在偶数维的矩阵中,对角线元素的数量是偶数,它们平均分布在矩阵的两侧。例如,在4x4矩阵中,主对角线是从(0,0)到(3,3),而副对角线是从(0,3)到(3,0),两条线在中心四个元素附近相互穿过,但不会在同一位置相遇。
🦆
在算法实现中,为什么要将中心元素减去一次,这样做的具体原因是什么?
如之前所述,当矩阵的维数是奇数时,中心元素位于主对角线和副对角线的交点。在遍历时,中心元素会被两次加入到总和中(一次作为主对角线的成员,一次作为副对角线的成员)。为了保证总和的准确性,我们需要将中心元素从总和中减去一次,否则它将被错误地计算两次。
🦆
在编写这个算法时,是否考虑了矩阵可能不是正方形的情况?如果矩阵不是正方形,算法还适用吗?
题解中的算法假定矩阵是正方形的,即行数和列数相等。如果矩阵不是正方形(即行数和列数不同),算法将无法正确运行,因为索引将超出范围。在非正方形矩阵中,主对角线和副对角线的定义也变得模糊,因为不存在明确的对应关系。如果需要处理非正方形矩阵,算法需要进行相应的调整以适应不同的行列数。

相关问题