LeetCode刷題筆記 37 數獨問題

2021-10-09 11:43:41 字數 1953 閱讀 7913

leetcode原題位址

乙個數獨的解法需遵循如下規則:

數字 1-9 在每一行只能出現一次。

數字 1-9 在每一列只能出現一次。

數字 1-9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。

空白格用 '.' 表示。

輸入

輸出

解數獨本質上就是填入乙個數字,判斷是否滿足條件,不行就換下乙個數字。

這就很像回溯問題。

先搬出回溯演算法框架:

def

func

(self, nums)

:def

backtrack()

:if 結束條件:

return

for i in 可選項:

做選擇進入下一層決策樹

撤銷選擇

backtrack(

)

結束條件:可選項:用[1-9]集合 減去[行,列,區域] 已經出現的數字集合,就是可以選擇的數字

決策:

class

solution

:def

solvesudoku

(self, board: list[list[

str]])

->

none

:"""

do not return anything, modify board in-place instead.

"""defcandidate

(i, j)

: old =

set(board[i]

)# 橫向

[old.add(board[t]

[j])

for t in

range(9

)]# 縱向

m_a, n_a = i //

3, j //

3#區域

for m in

range(3

):for n in

range(3

):old.add(board[m_a *

3+ m]

[n_a *

3+ n]

)return

set(

'123456789'

)- old

defbacktrack

(row, col)

:if row ==9:

# 結束條件

return

true

if col ==9:

# 單行結束條件

return backtrack(row +1,

0)if board[row]

[col]

!='.'

:return backtrack(row, col +1)

# 進入下一層決策樹

for num in candidate(row, col)

: board[row]

[col]

= num # 做選擇

if backtrack(row, col +1)

:# 進入下一層決策樹

return

true

board[row]

[col]

='.'

# 撤回選擇

return

false

backtrack(0,

0)

所有**都在這了。

LeetCode刷題筆記 兩數相加

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 1 輸入 l1 2,4,3 l2 5,6,4 輸出 7,0,8 ...

LeetCode刷題筆記 兩數之和

題目描述 兩數之和 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2,7,11,15 target 9 因為 nums 0 nu...

LeetCode刷題 醜數

編寫乙個程式判斷給定的數是否為醜數。醜數就是只包含質因數 2,3,5 的正整數。示例 1 輸入 6 輸出 true 解釋 6 2 3 示例 2 輸入 8 輸出 true 解釋 8 2 2 2 示例 3 輸入 14 輸出 false 解釋 14 不是醜數,因為它包含了另外乙個質因數 7。說明 1 是醜...