数组题目:矩阵对角线元素的和

题目

标题和出处

标题:矩阵对角线元素的和

出处:1572. 矩阵对角线元素的和

难度

1 级

题目描述

要求

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

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

示例

示例 1:

示例 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} 1n100
  • 1 ≤ mat[i][j] ≤ 100 \texttt{1} \le \texttt{mat[i][j]} \le \texttt{100} 1mat[i][j]100

解法

思路和算法

遍历矩阵 mat \textit{mat} mat 的对角线元素即可。当矩阵 mat \textit{mat} mat 的行数和列数为 n n n 时,对于任意 0 ≤ i < n 0 \le i<n 0i<n,第 i i i 行第 i i i 列的元素和第 i i i 行第 n − 1 − i n-1-i n1i 列的元素为对角线元素,将对角线元素加到对角线元素和即可。

n n n 为奇数时,存在 i = n − 1 2 i=\frac{n-1}{2} i=2n1 使得 i = n − 1 − i i=n-1-i i=n1i,因此第 i i i 行只有一个对角线元素,如果按照上述方法,该元素被计算了两次,因此需要在对角线元素和中减去该元素,使得该元素在对角线元素和中只被计算一次。

下图的矩阵为 3 × 3 3 \times 3 3×3 的矩阵,由于行数和列数为奇数,因此中间的元素同时在两条对角线上。按照上述方法计算时,绿色位置的元素被计算一次,红色位置的元素被计算两次,因此需要在对角线元素和中减去红色位置的元素,避免重复计算。

图片 1

下图的矩阵为 4 × 4 4 \times 4 4×4 的矩阵,由于行数和列数为偶数,因此不存在同时在两条对角线上的元素。按照上述方法计算时,绿色位置的元素被计算一次,不存在重复计算的元素。

图片 2

代码

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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的车尔尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值