【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:力扣官方题解
相关推荐
j7~34 分钟前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史
龙泽金1 小时前
矩阵论简介与工程应用
数学建模·矩阵·自动控制
无小道1 小时前
C/C++——可变参数
c语言·开发语言·c++·可变参数
hele_two1 小时前
C++模拟蚁群(二)
c++·算法·数学建模·图形渲染
WK100%1 小时前
LeetCode双题:滑动窗口破解最小子数组
c++·经验分享·笔记·算法
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.09.02 题目:3875.构造奇偶一致的数组 I
笔记·算法·leetcode
@福者2 小时前
C++ QT 入门
开发语言·c++·qt
沧海一笑-dj2 小时前
【C++】Visual Studio 2026下载和安装
c++·visual studio·vs·vs2026
HugoStudio_SWAN2 小时前
洛谷 P1321 单词覆盖还原——从蜡板上的密信到数字水印
c++·学习·程序人生·算法
励志不掉头发的内向程序员2 小时前
【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之Action与命令系统
linux·开发语言·c++·qt·学习·系统架构