46全排列

时间:2019-11-27
本文章向大家介绍46全排列,主要包括46全排列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

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

来源: https://leetcode-cn.com/problems/permutations/

法一: 自己的代码

思路: 很基本的回溯算法,没有剪枝条件,r中每次传递的都是去掉已经用过的数,

class Solution:
    def permute(self, nums):
        resluts = []
        l = len(nums)
        # 注意这里的nums如果不初始化的话,要放在a的前边,否则报错.
        def backtrack(a=[], nums=nums):
            # 深度优先遍历,即回溯终止的条件
            if len(a) == l:
                resluts.append(a)
            for j,i in enumerate(nums):
                # 每次回溯前,都将该数删除,为了下次回溯for循环的时候不再用
                # 这里没有用状态重置是因为 回溯时用了r来赋值给nums,每次回溯结束后仍然是原来的状态
                r = nums.copy()
                del r[j]
                # 这里的i必须加[]
                backtrack( a+[i], r)
                # 也可以不用引入r直接生成list传递,耗时稍微短点
                # backtrack( a+[i], [k for k in nums if k != i])
        backtrack()
        return resluts
if __name__ == "__main__":
    duixiang = Solution()
    a = duixiang.permute([1,2,3])
    print(a)
View Code

法二:

原文地址:https://www.cnblogs.com/xxswkl/p/11941786.html