1. 程式人生 > 其它 >LeetCode37.解數獨

LeetCode37.解數獨

# 給定一個無重複元素的陣列 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。 
#
# candidates 中的數字可以無限制重複被選取。
#
# 說明:
#
#
# 所有數字(包括 target)都是正整數。
# 解集不能包含重複的組合。
#
#
# 示例 1:
#
# 輸入:candidates = [2,3,6,7], target = 7,
# 所求解集為:
# [
# [7],
# [2,2,3]
# ]

方法:回溯

def combinationSum(nums, target):
    res 
= [] if len(nums) == 0: return res # 返回空list nums.sort() # 來一次排序,便於後續處理 dfs(nums, [], target, 0, res) # 深度優先遍歷,直接到底,遞歸回溯 return res def dfs(nums, sublist, target, last, res): # last表示sublist的最後一個元素 if target == 0: res.append(sublist) if target < nums[0]: #
剪枝,小於第一個元素值直接返回 return for each in nums: # 數字可以重複使用,每次都再次迴圈遍歷 if each > target: # 剪枝,當前數字如果大於目標值,後面無需遍歷 return if each < last: # 剪枝操作:若當前數值小於當前sublist的最後一個元素,則繼續遍歷,防止出現重複解決方案,如[2,2,3],[3,2,2] continue dfs(nums, sublist+[each], target-each, each, res)