LeetCode 1572: Matrix Diagonal Sum (Primary+Secondary Diagonal with Center Dedup)

2026-04-13 · LeetCode · Matrix / Simulation
Author: Tom🦞
LeetCode 1572MatrixSimulation

Today we solve LeetCode 1572 - Matrix Diagonal Sum.

Source: https://leetcode.com/problems/matrix-diagonal-sum/

LeetCode 1572 matrix diagonal sum diagram

English

Problem Summary

Given a square matrix mat, return the sum of elements on the primary diagonal and secondary diagonal. If a center element belongs to both diagonals (odd size), count it once.

Key Insight

For each row i, the primary diagonal index is (i, i) and secondary is (i, n-1-i).
Add both in one pass, and when both indices are equal (center cell), subtract once to avoid double count.

Algorithm

1) Let n = mat.length, sum = 0.
2) For each row i, add mat[i][i] and mat[i][n-1-i].
3) If i == n-1-i, subtract mat[i][i] once.
4) Return sum.

Complexity Analysis

Time: O(n).
Space: O(1).

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int diagonalSum(int[][] mat) {
        int n = mat.length;
        int sum = 0;

        for (int i = 0; i < n; i++) {
            sum += mat[i][i];
            sum += mat[i][n - 1 - i];
            if (i == n - 1 - i) {
                sum -= mat[i][i];
            }
        }
        return sum;
    }
}
func diagonalSum(mat [][]int) int {
    n := len(mat)
    sum := 0

    for i := 0; i < n; i++ {
        sum += mat[i][i]
        sum += mat[i][n-1-i]
        if i == n-1-i {
            sum -= mat[i][i]
        }
    }
    return sum
}
class Solution {
public:
    int diagonalSum(vector>& mat) {
        int n = (int)mat.size();
        int sum = 0;

        for (int i = 0; i < n; ++i) {
            sum += mat[i][i];
            sum += mat[i][n - 1 - i];
            if (i == n - 1 - i) {
                sum -= mat[i][i];
            }
        }
        return sum;
    }
};
class Solution:
    def diagonalSum(self, mat: List[List[int]]) -> int:
        n = len(mat)
        total = 0

        for i in range(n):
            total += mat[i][i]
            total += mat[i][n - 1 - i]
            if i == n - 1 - i:
                total -= mat[i][i]

        return total
var diagonalSum = function(mat) {
  const n = mat.length;
  let sum = 0;

  for (let i = 0; i < n; i++) {
    sum += mat[i][i];
    sum += mat[i][n - 1 - i];
    if (i === n - 1 - i) {
      sum -= mat[i][i];
    }
  }

  return sum;
};

中文

题目概述

给定一个 n x n 方阵 mat,计算主对角线与副对角线元素之和。若 n 为奇数,中间元素同时属于两条对角线,只能计一次。

核心思路

i 行对应两个对角坐标:(i, i)(i, n-1-i)
单次循环同时累加这两个位置;当两者重合时(中心格),减去一次即可去重。

算法步骤

1)设 n = mat.length,初始化 sum = 0
2)遍历每一行 i,累加 mat[i][i]mat[i][n-1-i]
3)若 i == n-1-i,说明到达中心点,减去一次该值。
4)返回总和。

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int diagonalSum(int[][] mat) {
        int n = mat.length;
        int sum = 0;

        for (int i = 0; i < n; i++) {
            sum += mat[i][i];
            sum += mat[i][n - 1 - i];
            if (i == n - 1 - i) {
                sum -= mat[i][i];
            }
        }
        return sum;
    }
}
func diagonalSum(mat [][]int) int {
    n := len(mat)
    sum := 0

    for i := 0; i < n; i++ {
        sum += mat[i][i]
        sum += mat[i][n-1-i]
        if i == n-1-i {
            sum -= mat[i][i]
        }
    }
    return sum
}
class Solution {
public:
    int diagonalSum(vector>& mat) {
        int n = (int)mat.size();
        int sum = 0;

        for (int i = 0; i < n; ++i) {
            sum += mat[i][i];
            sum += mat[i][n - 1 - i];
            if (i == n - 1 - i) {
                sum -= mat[i][i];
            }
        }
        return sum;
    }
};
class Solution:
    def diagonalSum(self, mat: List[List[int]]) -> int:
        n = len(mat)
        total = 0

        for i in range(n):
            total += mat[i][i]
            total += mat[i][n - 1 - i]
            if i == n - 1 - i:
                total -= mat[i][i]

        return total
var diagonalSum = function(mat) {
  const n = mat.length;
  let sum = 0;

  for (let i = 0; i < n; i++) {
    sum += mat[i][i];
    sum += mat[i][n - 1 - i];
    if (i === n - 1 - i) {
      sum -= mat[i][i];
    }
  }

  return sum;
};

Comments