---
# System prepended metadata

title: 36. Valid Sudoku
tags: ['36', leetcode, medium]

---

# 36. Valid Sudoku
###### tags: `leetcode` `36` `medium` 

## :memo:  Question
Determine if a ```9 x 9``` Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

Each row must contain the digits ```1-9``` without repetition.
Each column must contain the digits ```1-9``` without repetition.
Each of the nine ```3 x 3``` sub-boxes of the grid must contain the digits ```1-9``` without repetition.

```
Note:
A Sudoku board (partially filled) could be valid but is not necessarily solvable.
Only the filled cells need to be validated according to the mentioned rules.
```
## :memo: 題意
* 就是給你 9*9 的數獨矩陣，讓你判斷這是不是有效的數獨，note 有提醒你你只要去判斷他給你的矩陣是有數字的就好，空格的就不用去管他。


## :memo: My first solution
* :medal: **思考一**: 這題我一開始的想法就是用 dictionary 去判斷每行每列以及每個3*3的九宮格是否有重複的數字，有重複的就 return False 沒有就將值塞到 dictionary。暴力 for loop ，因為我想不到有更好的解法。



## :memo: Code

```python=
class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        x = len(board)
        y = len(board[0])
        
        for i in range(x):
            dicx = {} 
            for j in range(y):
                if board[i][j].isdigit():
                    if board[i][j] not in dicx:
                        dicx[board[i][j]]  = True
                    else:
                        return False
        
        for i in range(y):
            dicx = {}
            for j in range(x):
                if board[j][i].isdigit():
                    if board[j][i] not in dicx:
                        dicx[board[j][i]]  = True
                    else:
                        return False
                    
        zz = [[0,0],[0,3],[0,6],[3,0],[3,3],[3,6],[6,0],[6,3],[6,6]]

        for a,b in zz:
            dicx = {}
            for i in range(3):    
                for j in range(3):
                    if board[a+i][b+j].isdigit():
                        if board[a+i][b+j] not in dicx:
                            dicx[board[a+i][b+j]]  = True
                        else:
                            return False

```
:bulb: **檢討**: 程式真的寫得蠻醜的，然後是非常暴力的寫法，檢驗 3 * 3 方格這麼想了比較久要怎麼寫，應該要是可以合再一起寫的，但我覺得如果我是第一次遇到這題目，我面試應該寫不出來，所以直接硬寫一個很醜的答案，最後submit有過，沒有 time out。
這個時間複雜度就是 9 * 9 * 3。

## :memo: 別人的漂亮寫法 Code

```python=

class Solution:
    def isValidSudoku(self, board: List[List[str]]) -> bool:
        rows = [set() for i in range(9)]
        cols = [set() for i in range(9)]
        mMat = [set() for i in range(9)]
        
        for i in range(9):
            for j in range(9):
                cur = board[i][j]
                if cur != '.':
                    
                    k = (i // 3 ) * 3 + j // 3
                
                    if cur not in rows[i]: rows[i].add(cur)
                    else: return False
                    
                    if cur not in cols[j]: cols[j].add(cur)
                    else: return False
                
                    if cur not in mMat[k]: mMat[k].add(cur)
                    else: return False
        return True
```

:bulb: **討論**: 這種寫法漂亮很多時間複雜度也下降，只要 9 * 9。

## :memo: bigO
* 時間複雜度: O(9 * 9)
* 空間複雜度: O(9 * 9 * 9)，最差的情況，input 給你解完的數獨，所以每個set都塞好塞滿
