题目
标题和出处
标题:矩阵对角线元素的和
难度
1 级
题目描述
要求
给你一个正方形矩阵 mat \texttt{mat} mat,请你返回矩阵对角线元素的和。
请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。
示例
示例 1:
输入:
mat
=
[[
1
,2,
3
]
,
\texttt{mat = [[}\bm{1}\texttt{,2,}\bm{3],}
mat = [[1,2,3],
[4,
5
,6],
~~~~~~~~~~~~~~~~~~~~~~~~\texttt{[4,}\bm{5}\texttt{,6],}
[4,5,6],
[
7
,8,
9
]]
~~~~~~~~~~~~~~~~~~~~~~~~\texttt{[}\bm{7}\texttt{,8,}\bm{9}\texttt{]]}
[7,8,9]]
输出:
25
\texttt{25}
25
解释:对角线的和为:
1
+
5
+
9
+
3
+
7
=
25
\texttt{1 + 5 + 9 + 3 + 7 = 25}
1 + 5 + 9 + 3 + 7 = 25
请注意,元素
mat[1][1]
=
5
\texttt{mat[1][1] = 5}
mat[1][1] = 5 只会被计算一次。
示例 2:
输入:
mat
=
[[
1
,1,1,
1
],
\texttt{mat = [[}\bm{1}\texttt{,1,1,}\bm{1}\texttt{],}
mat = [[1,1,1,1],
[1,
1
,
1
,1],
~~~~~~~~~~~~~~~~~~~~~~~~\texttt{[1,}\bm{1}\texttt{,}\bm{1}\texttt{,1],}
[1,1,1,1],
[1,
1
,
1
,1],
~~~~~~~~~~~~~~~~~~~~~~~~\texttt{[1,}\bm{1}\texttt{,}\bm{1}\texttt{,1],}
[1,1,1,1],
[
1
,1,1,
1
]]
~~~~~~~~~~~~~~~~~~~~~~~~\texttt{[}\bm{1}\texttt{,1,1,}\bm{1}\texttt{]]}
[1,1,1,1]]
输出:
8
\texttt{8}
8
示例 3:
输入:
mat
=
[[
5
]]
\texttt{mat = [[}\bm{5}\texttt{]]}
mat = [[5]]
输出:
5
\texttt{5}
5
数据范围
- n = mat.length = mat[i].length \texttt{n}=\texttt{mat.length}=\texttt{mat[i].length} n=mat.length=mat[i].length
- 1 ≤ n ≤ 100 \texttt{1} \le \texttt{n} \le \texttt{100} 1≤n≤100
- 1 ≤ mat[i][j] ≤ 100 \texttt{1} \le \texttt{mat[i][j]} \le \texttt{100} 1≤mat[i][j]≤100
解法
思路和算法
遍历矩阵 mat \textit{mat} mat 的对角线元素即可。当矩阵 mat \textit{mat} mat 的行数和列数为 n n n 时,对于任意 0 ≤ i < n 0 \le i<n 0≤i<n,第 i i i 行第 i i i 列的元素和第 i i i 行第 n − 1 − i n-1-i n−1−i 列的元素为对角线元素,将对角线元素加到对角线元素和即可。
当 n n n 为奇数时,存在 i = n − 1 2 i=\frac{n-1}{2} i=2n−1 使得 i = n − 1 − i i=n-1-i i=n−1−i,因此第 i i i 行只有一个对角线元素,如果按照上述方法,该元素被计算了两次,因此需要在对角线元素和中减去该元素,使得该元素在对角线元素和中只被计算一次。
下图的矩阵为 3 × 3 3 \times 3 3×3 的矩阵,由于行数和列数为奇数,因此中间的元素同时在两条对角线上。按照上述方法计算时,绿色位置的元素被计算一次,红色位置的元素被计算两次,因此需要在对角线元素和中减去红色位置的元素,避免重复计算。
下图的矩阵为 4 × 4 4 \times 4 4×4 的矩阵,由于行数和列数为偶数,因此不存在同时在两条对角线上的元素。按照上述方法计算时,绿色位置的元素被计算一次,不存在重复计算的元素。
代码
class Solution {
public int diagonalSum(int[][] mat) {
int sum = 0;
int n = mat.length;
for (int i = 0; i < n; i++) {
sum += mat[i][i];
sum += mat[i][n - 1 - i];
}
if (n % 2 != 0) {
sum -= mat[n / 2][n / 2];
}
return sum;
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是矩阵 mat \textit{mat} mat 的行数和列数。矩阵共有 n n n 行,每行最多有 2 2 2 个对角线元素,遍历每行的对角线元素,计算对角线元素和即可。
-
空间复杂度: O ( 1 ) O(1) O(1)。