【1572. 矩阵对角线元素的和】

来源:力扣(LeetCode)

描述:

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

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

示例 1:

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

示例 2:

cpp 复制代码
输入:mat = [[1,1,1,1],
            [1,1,1,1],
            [1,1,1,1],
            [1,1,1,1]]
输出:8

示例 3:

cpp 复制代码
输入:mat = [[5]]
输出:5

提示:

  • n == mat.length == mati.length
  • 1 <= n <= 100
  • 1 <= matij <= 100

方法一:遍历矩阵

思路与算法

我们知道矩阵中某个位置 (i, j) 处于对角线上,则一定满足下列条件之一:

  • i = j;
  • i + j = n − 1;

根据上述结论,我们可以遍历整个矩阵,如果当前坐标 (i, j) 满足 i = j 或者 i + j = n − 1 则表示该位置一定在对角线上,则把当前的数字加入到答案之中。

代码:

cpp 复制代码
class Solution {
public:
    int diagonalSum(vector<vector<int>>& mat) {
        int n = mat.size(), sum = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i == j || i + j == n - 1) {
                    sum += mat[i][j];
                }
            }
        }
        return sum;
    }
};

时间 12ms 击败 77.20%使用 C++ 的用户

内存 10.61mb 击败 89.00%使用 C++ 的用户
复杂度分析

  • 时间复杂度:O(n2),其中 n 是矩阵 mat 的行数。
  • 空间复杂度:O(1)。

方法二:枚举对角线元素

思路与算法

逐行遍历,记当前的行号为 i,则当前行中处于对角线的元素为: 坐标 (i, i) 和坐标 (i, n − i − 1),因此我们把 (i, i) 与 (i, n − i − 1) 处的数字加入到答案中。 如果 n 是奇数的话,则主对角线与副对角线存在交点 (⌊ n 2 n \over 2 2n⌋, ⌊ n 2 n \over 2 2n⌋),该点会被计算两次。所以当 n 为奇数的时候,需要减掉交点处的值。

代码:

cpp 复制代码
class Solution {
public:
    int diagonalSum(vector<vector<int>>& mat) {
        int n = mat.size(), sum = 0, mid = n / 2;
        for (int i = 0; i < n; ++i) {
            sum += mat[i][i] + mat[i][n - 1 - i];
        }
        return sum - mat[mid][mid] * (n & 1);
    }
};

时间 12ms 击败 77.20%使用 C++ 的用户

内存 10.68mb 击败 54.80%使用 C++ 的用户
复杂度分析

  • 时间复杂度:O(n),其中 n 是矩阵 mat 的行数。
  • 空间复杂度:O(1)。
    author:力扣官方题解
相关推荐
flower9803231 分钟前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
lengxuenong26 分钟前
树状数组 · 信息学学习手册3-优化LIS
c++·学习·算法
fanfan_hongyun37 分钟前
【UE5.1 创建C++文件】
c++·ue5
余额瞒着我当琳43 分钟前
C++11,发展历史浅谈,初始化列表和对象初始化,右值引用和移动语义
java·开发语言·c++·算法
suhan1 小时前
【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
数据结构·算法·排序算法
suhan1 小时前
【数据结构】六、图:3.十字链表、邻接多重表、边集数组
数据结构·算法·排序算法
Tsuki_tl1 小时前
【优选算法:双指针】——复写零题解
java·c++·算法·leetcode·数组·双指针·复写零
程序猿编码2 小时前
不用 PyTorch!从零手写 C++ 深度学习框架,自动微分、CUDA、分布式一把搞定
c++·深度学习·大模型推理·自动微分
real_metrix2 小时前
【学习笔记】C/C++ 头文件自包含
c++·c·头文件·自包含
雪落漂泊2 小时前
C++算法 滑动窗口篇(上)
开发语言·c++·算法