矩阵对角线元素的和
难度:
标签:
题目描述
给你一个正方形矩阵 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是偶数,则主对角线和副对角线没有交点。能否解释更多关于这一点的细节,例如为什么没有交点?
▷🦆
在算法实现中,为什么要将中心元素减去一次,这样做的具体原因是什么?
▷🦆
在编写这个算法时,是否考虑了矩阵可能不是正方形的情况?如果矩阵不是正方形,算法还适用吗?
▷