Easy草稿★★★★★O(n) 時間 · O(1) 空間
MathMatrixArray
Patterns🧮 數學・組合
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

1572Matrix Diagonal SumMath & GeometryEasyMath & Geometry

給定一個正方形矩陣 mat,回傳主對角線和副對角線元素的總和。如果某個元素同時在兩條對角線上,只計算一次。

Example:

Input: mat = [[1,2,3],[4,5,6],[7,8,9]] Output: 25 (1+5+9 + 3+5+7 = 30, 但 5 重複所以 30-5 = 25)

Intuition

TIP

核心思路:遍歷每一行,加上主對角線 mat[i][i] 和副對角線 mat[i][n-1-i] 的值,注意中心點不要重複計算。

Approaches

⭐ 1. Single Pass — O(n) / O(1)
  • Idea: 遍歷每行加上兩條對角線的值,最後若 n 為奇數則減去中心元素
  • Time: O(n) - 遍歷 n 行
  • Space: O(1)
class Solution {
    fun diagonalSum(mat: Array<IntArray>): Int {
        val n = mat.size
        var sum = 0
        for (i in 0 until n) {
            sum += mat[i][i]           // 主對角線
            sum += mat[i][n - 1 - i]   // 副對角線
        }
        // 若 n 為奇數,中心元素被加了兩次
        if (n % 2 == 1) {
            sum -= mat[n / 2][n / 2]
        }
        return sum
    }
}
2. Conditionals to Avoid Duplicates — O(n) / O(1)
  • Idea: 在迴圈中直接判斷是否為同一元素,避免最後的修正
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun diagonalSum(mat: Array<IntArray>): Int {
        val n = mat.size
        var sum = 0
        for (i in 0 until n) {
            sum += mat[i][i]
            if (i != n - 1 - i) {
                sum += mat[i][n - 1 - i]
            }
        }
        return sum
    }
}

🔑 Takeaways