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 是醜...