回溯算法-全排列

回溯本质

解决一个 回溯问题,其实就是一个决策树的遍历问题,需要思考以下3个问题:

  1. 路径:已经做出的选择
  2. 选择列表:当前可以做的选择
  3. 结束条件:到达决策树底层,无法选择

代码框架

res = []
def backtrack(路径,选择列表):
	if 满足结束条件:
		res.add(路径)
		return
	for 选择 in 选择列表:
		做选择
		backtrack(路径,选择列表)
		撤销选择

全排列问题

image

代码实现

class Solution:
    def permute(self,nums:List[int]) -> List[List[int]]:

        size = len(nums)
        ans = []
        track = []
        # nums:选择列表,track:当前路径
        # 选择列表:nums 中不存在于 track 的那些元素
        def backtrack(nums,track):
            # 所有的数字都填完了,返回一个排列结果
            if len(track) == len(nums):
                ans.append(track[:])
                return
                
            for i in range(len(nums)):
                if nums[i] in track:
                    continue

                track.append(nums[i])
                # 继续递归填入下一个数
                backtrack(nums,track)

                #撤销操作
                track.pop()

        backtrack(nums,track)

        return ans 

posted @ 2022-03-07 22:39  topbookcc  阅读(43)  评论(0编辑  收藏  举报
/* 鼠标点击求赞文字特效 */