回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法。
也就是說解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程。在這個過程中只需要思考三個問題:
(1)路徑:也就是已經做出的選擇;
(2)選擇列表:也就是你當前可以做的選擇;
(3)結束條件:也就是1到達決策樹底層,無法再做選擇的條件
回溯演算法框架:
result =
defbacktrack
(路徑, 選擇列表)
:if 滿足結束條件:
result.add(路徑)
return
for 選擇 in 選擇列表:
做選擇backtrack(路徑, 選擇列表)
撤銷選擇
核心是for迴圈裡面的遞迴,在遞迴呼叫之前做選擇,在遞迴呼叫之後撤銷選擇。
leetcode演算法題庫裡面的39題:
給定乙個無重複元素的陣列 candidates 和乙個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。
# 剪枝操作,優化**
break
) self.backtrack(res, candidates, residue, path, size)
path.pop(
)if __name__ ==
'__main__'
: candidates =[2
,3,6
,7] target =
7 solution = solution(
) result = solution.combinationsum(candidates, target)
(result)
結果:
[[2
,2,3
],[7
]]
leetcode演算法題庫裡面的46題:
:# 如果滿足滿足結束條件則新增路徑
iflen
(path)
== n:
path_s = path.copy(
)return
for i in
range(0
, n)
:if nums[i]
notin path:
#每個數字只能用一次
# 路徑選擇
)# 回溯
backtrack(path, nums)
# 撤銷路徑
path.pop(
) result =
n =len(nums)
path =
backtrack(path, nums)
return result
[leetcode演算法題庫裡面的47題
:# 如果滿足滿足結束條件則新增路徑
iflen
(path)
== n and path not
in result:
path_s = path.copy(
)return
for i in
range(0
, n)
:# 路徑選擇
# 設定index可以保證不做重複選擇
if i not
in index:
)else
:continue
# 回溯
backtrack(
)# 撤銷選擇
path.pop(
) index.pop(
) result =
n =len(nums)
index =
path =
backtrack(
)return result
參考labuladong的博文
leetcode上的**
leetcode演算法題庫裡面的79題
劍指offer
回溯演算法的原理和示例
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,...
由素數環思考回溯演算法的實現步驟
素數環,相鄰兩個相加是否為素數,數字範圍 1 20 陣列 和是否素數 回溯,返回到上乙個 public class primering if arr k numlength k numlength 1 if arr k 1 else 判斷當前放進的數字是否符合條件 1.是否與之前重複 2.相鄰之和是...
XOR演算法的原理和實現
當乙個數a和另乙個數b進行異或運算會生成另乙個數c,如果再將c和b進行異或運算則c又會還原為a。相對於其他的簡易加密演算法,xor演算法的優點如下。1 演算法簡單,對於高階語言很容易能實現。2 速度快,可以在任何時候 任何地方使用。3 對任何字元都是有效的,不像有些簡易加密演算法,只對西文字元有效,...