---
# System prepended metadata

title: 1572. Matrix Diagonal Sum
tags: [JavaScript, Array/String]

---

# Matrix Diagonal Sum
題目描述：
  
給定一個矩陣 mat，請計算它的對角線元素的和。

說明：

1. 矩陣的對角線是從左上到右下的一條直線。
1. 輸入矩陣的行數和列數不超過100。
1. 輸入矩陣中的整數在(-2^31, 2^31 - 1)範圍內。

解題思路：

1. 遍歷矩陣，並計算主對角線和副對角線上的元素的和。
1. 如果矩陣的行數和列數是奇數，那麼它的中心元素會被計算兩次，因此需要減去一次。
1. 返回主對角線和副對角線上元素的總和。
```c++=
class Solution {
public:
    int diagonalSum(vector<vector<int>>& mat) {
        //正對角線[0][0], [1][1], [2][2], ..., [i][i]
        //逆對角線[0][n-1-0], [1][n-1-1], ..., [i][n-1-i];
        //中心點如果n為奇數會重複計算
        int sum = 0;
        int n = mat.size();
        for(int i = 0; i < mat.size(); i++){        
            sum += mat[i][i] + mat[i][n-1-i];
        }
        if((n % 2) == 1){                       //利用%求餘判斷是否是奇數matrix
            sum -= mat[n/2][n/2];
        }
        return sum;
    }
};
```
```C++=
class Solution {
public:
    int diagonalSum(vector<vector<int>>& mat) {
        //正對角線[0][0], [1][1], [2][2], ..., [i][i]
        //逆對角線[0][n-1-0], [1][n-1-1], ..., [i][n-1-i];
        //中心點如果n為奇數會重複計算
        int sum = 0;    // 初始對角線和為0
        int n = mat.size();  // n為matrix的大小，由於matrix是正方形，可以只取其中一個維度的大小
        for(int i = 0; i < mat.size(); i++){  // 遍歷matrix中每一列
            sum += mat[i][i] + mat[i][n-1-i];  // 將正對角線和逆對角線的值加總
        }
        if((n % 2) == 1){    // 如果matrix的大小是奇數
            sum -= mat[n/2][n/2];  // 減去中心點的值，中心點會被重複計算
        }
        return sum;   // 回傳對角線和
    }
};
```


###### tags: `array`

```javascript=
/**
 * @param {number[][]} mat
 * @return {number}
 */
var diagonalSum = function(mat) {
    let m = mat.length;
    let sum = 0;
    for(let i = 0; i < m; i++){
        sum += mat[i][i];
        sum += mat[i][m-i-1];
    }
    if(m % 2 === 1){
        sum -= mat[Math.floor(m / 2)][Math.floor(m / 2)];
    }
    return sum;
};

```


