矩阵对角线元素的和

标签: 数组 矩阵

难度: Easy

给你一个正方形矩阵 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

Submission

运行时间: 19 ms

内存: 16.3 MB

class Solution:
    def diagonalSum(self, mat: List[List[int]]) -> int:
        mat_len = len(mat)
        result = 0
        if mat_len % 2:
            for i in range(mat_len):
                result += mat[i][i]
                result += mat[i][mat_len - 1 - i]
            result -= mat[(mat_len - 1) // 2][(mat_len - 1) // 2]
        else:
            for i in range(mat_len):
                result += mat[i][i]
                result += mat[i][mat_len - 1 - i]      
        return result   

Explain

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

时间复杂度: O(n)

空间复杂度: O(1)

# Solution class to calculate diagonal sum of a matrix

class Solution:
    def diagonalSum(self, mat: List[List[int]]) -> int:
        mat_len = len(mat)  # Get the size of the matrix
        result = 0  # Initialize result to store the sum
        # Determine if the matrix size is odd or even
        if mat_len % 2:
            for i in range(mat_len):
                result += mat[i][i]  # Add main diagonal element
                result += mat[i][mat_len - 1 - i]  # Add secondary diagonal element
            # Subtract the center element once if matrix size is odd
            result -= mat[(mat_len - 1) // 2][(mat_len - 1) // 2]
        else:
            for i in range(mat_len):
                result += mat[i][i]  # Add main diagonal element
                result += mat[i][mat_len - 1 - i]  # Add secondary diagonal element
        return result  # Return the computed sum

Explore

在奇数维数的矩阵中,主对角线和副对角线会在中心元素处交叉。这意味着中心的元素在计算时会被重复计算两次(一次作为主对角线的一部分,一次作为副对角线的一部分)。因此,为了确保每个元素只被计算一次,需要从总和中减去中心元素一次,以纠正这一重复计算的问题。

在偶数维数的矩阵中,主对角线和副对角线不会在任何单一元素上相交。这是因为在偶数维的矩阵中,对角线元素的数量是偶数,它们平均分布在矩阵的两侧。例如,在4x4矩阵中,主对角线是从(0,0)到(3,3),而副对角线是从(0,3)到(3,0),两条线在中心四个元素附近相互穿过,但不会在同一位置相遇。

如之前所述,当矩阵的维数是奇数时,中心元素位于主对角线和副对角线的交点。在遍历时,中心元素会被两次加入到总和中(一次作为主对角线的成员,一次作为副对角线的成员)。为了保证总和的准确性,我们需要将中心元素从总和中减去一次,否则它将被错误地计算两次。

题解中的算法假定矩阵是正方形的,即行数和列数相等。如果矩阵不是正方形(即行数和列数不同),算法将无法正确运行,因为索引将超出范围。在非正方形矩阵中,主对角线和副对角线的定义也变得模糊,因为不存在明确的对应关系。如果需要处理非正方形矩阵,算法需要进行相应的调整以适应不同的行列数。