LeetCode 1572: Matrix Diagonal Sum (Primary+Secondary Diagonal with Center Dedup)
LeetCode 1572MatrixSimulationToday we solve LeetCode 1572 - Matrix Diagonal Sum.
Source: https://leetcode.com/problems/matrix-diagonal-sum/
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 totalvar 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 totalvar 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