原文链接:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-xiang-jie-by-labuladong-2/
回溯算法框架:
解决回溯算法的关键是想清楚如下几点:
1.路径,已经经过的路径
2.选择列表,当前可选择的列表
3.终止条件
基本框架代码:
result = []
def dfs(路径,选择列表):
if 满足终止条件:
result.append(路径)
for 选择 in 选择列表:
做选择
dfs(路径,选择列表)
撤销选择
实例:
力扣46题,全排列问题(题目链接:https://leetcode-cn.com/problems/permutations/)
代码如下:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
visited = [0]*(len(nums))#当前数字是否被访问过
result_all = []
def dfs(n, nums, result):#n表示步数,nums是输入的数组,result是每步的结果
if n == len(nums):#终止条件
result_all.append(result[:])
for i in range(len(nums)):
#做选择
if visited[i] == 1:
continue
result.append(nums[i])
visited[i] = 1
#递归
dfs(n+1,nums,result)
#撤销选择
result.pop()
visited[i] = 0
result = []
dfs(0,nums,result)
return result_all