Skip to content
本站總訪問量
本站訪客數 人次

回溯法

回溯法的基本思想

回溯法本质上是一种系统性地搜索问题解空间的方法。它通过尝试各种可能的解决方案,并在发现当前路径不可行时"回溯"到之前的状态,继续探索其他可能性。这个过程实际上就是在搜索所有可能的解决方案。

牛刀小試

程式碼範例

Leetcode 40. 组合总和 II

python
class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        def backtrack(index, remaining, current):
            if remaining == 0:
                ans.append(current[:])
                return
            for i in range(index, len(candidates)):
                if i > index and candidates[i] == candidates[i - 1]:
                    continue
                if candidates[i] > remaining:
                    break
                current.append(candidates[i])
                backtrack(i + 1, remaining - candidates[i], current)
                current.pop()

        ans = []
        candidates.sort()
        backtrack(0, target, [])
        return ans

程式碼解釋

python
def backtrack(index, remaining, current):

定義一個內部的backtrack函數,用於回溯搜索。它接受三個參數:index(當前考慮的候選數字索引),remaining(剩餘需要達到的和),current(當前組合)。

python
if remaining == 0:
    ans.append(current[:])
    return

如果剩餘和為0,表示找到一個有效組合,將其添加到答案列表中並返回。

python
if i > index and candidates[i] == candidates[i - 1]:
    continue

跳過重複的數字,以避免重複組合。

python
if candidates[i] > remaining:
    break

如果當前數字大於剩餘和,由於數組已排序,後面的數字也會更大,因此可以直接退出循環。

python
current.append(candidates[i])
backtrack(i + 1, remaining - candidates[i], current)
current.pop()

將當前數字添加到組合中,遞歸調用backtrack函數,然後移除該數字以嘗試下一種可能。

初始化答案列表,對候選數字排序,調用backtrack函數開始搜索,最後返回答案。****

Contributors

The avatar of contributor named as lucashsu95 lucashsu95

Changelog