46 - 全排列 - python

解题前先读回溯算法解题套路框架

给定一个 没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

题目要求返回给定无重复元素数序列所有可能的全排列,那么就需要穷军所有可能的情况,用回溯法。

在这里插入图片描述

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = []
        l = len(nums)
        # nums: 选择列表
        # index:当前已有的元素个数
        # pre:当前路径
        # vis
        def backtrack(nums, pre, index = 0):
        	# if nums == []表示当前选择列表为空,已到达叶子结点
            if index == l:
                res.append(pre.copy())
                return
            for i in range(len(nums)):
                pre.append(nums[i])
                backtrack(nums[:i] + nums[i + 1:], pre, index + 1)
                pre.pop()


        if nums == []: return []
        # 递归函数
        backtrack(nums, [], 0)
        
        return res

代码运行流程图:


在这里插入图片描述

或者使用一个布尔列表来标记当前元素是否访问过,只有当当前元素未被访问过,才可以加入到路径中。

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res = []
        def backtrack(nums, pre, vis, index = 0):
            if index == len(nums):
                res.append(pre.copy())
                return
                
            for i in range(len(nums)):
                if vis[i] == False:
                    vis[i] = True
                    pre.append(nums[i])
                    backtrack(nums, pre, vis, index + 1)
                    # 回溯
                    vis[i] = False
                    pre.pop()


        if nums == []: return []
        # 定义访问列表,表示访问过的元素就不能再用
        vis = [False] * len(nums)
        # 递归函数
        backtrack(nums, [], vis, 0)
        
        return res
发布了449 篇原创文章 · 获赞 122 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/105238341
今日推荐