---
# System prepended metadata

title: 840. Magic Squares In Grid
tags: [leetcode, '840', medium, rewrite]

---

# 840. Magic Squares In Grid
###### tags: `leetcode` `840` `medium` `rewrite`

## :memo:  Question

![](https://i.imgur.com/bT1dObC.png)
![](https://i.imgur.com/6g2CapS.png)
![](https://i.imgur.com/0LdTiGf.png)


## :memo: 題意
* 給你一個矩陣，然後要你找出 magic square，magic square 的定義是在 3 * 3 矩陣內有 1 ~ 9 的數字，且所有的 rows 和 cols 和對角的數字加起來的總和是一樣的（如下圖 紅色 藍色 橘色的線上的數字總和要一樣）。
![](https://i.imgur.com/7IZG0n4.png)

## :memo: leetcode solution
* :medal: **思考一**: 那這樣 magic square 每行每列數字的總和應該是固定的，因為九宮格裡只有 1 ~ 9 的數字，所以數字的總和要是15 。
* :medal: **思考二**: 暴力解。


## :memo: leetcode solution code
```python=
class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        m = len(grid)
        n = len(grid[0])
        
        if m < 3 or n < 3:
            return 0
        
        
        def helper(x, y, m, n):
            if x <= m - 3 and y <= n - 3:
                g = [grid[k][y:y+3] for k in range(x,x+3)]
                if set([g[i][j] for i in range(3) for j in range(3)]) == {1,2,3,4,5,6,7,8,9}:
                    rows = list(map(sum, g))
                    cols = list(map(sum, zip(*g)))
                    diag = [g[0][0]+g[1][1]+g[2][2], g[2][0]+g[1][1]+g[0][2]]
                    if set(rows+cols+diag) == {15}:
                        return True
            return False
            
        
        ans = 0
        
        for x in range(m):
            for y in range(n):
                if helper(x, y, m, n):
                    ans +=1
        
        return ans
```

## :memo: BigO
* 時間複雜度: O((m-3)* (n-3)) 就是 O(m * n)。
* 空間複雜度: O(3* 3)，因為每檢查一次都要暫存 3 * 3 矩陣。 