46 全排列【python3】

该文章讨论如何使用递归方法解决给定无重复数字数组的全排列问题。代码中定义了一个Solution类,包含一个permute方法,通过辅助函数f进行深度遍历,当子列表长度等于原数组长度时添加到结果列表。方法通过检查元素是否已存在于子列表中避免重复排列。

题目

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

代码&思路

递归

全排列第一想法就是考虑递归了,而且无重复数字,if语句很简单

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        res=[] # 记录其可能的全排列

        def f(L):
            if len(L)==len(nums):
                res.append(L)
                return 'finish'
            for x in nums:
                if x not in L:
                    tmp=L[:]
                    tmp.append(x)
                    f(tmp)
        f([])
        return res
### Python 实现全排列的算法示例 以下是几种常见的实现方式及其代码示例: #### 方法一:递归法 递归是一种简单而优雅的方式,用于生成给定列表的所有全排列。 ```python def perm(l): if len(l) <= 1: return [l] r = [] for i in range(len(l)): s = l[:i] + l[i+1:] p = perm(s) for x in p: r.append([l[i]] + x) return r ``` 上述代码通过递归调用 `perm` 函数来逐步减少输入列表长度并构建最终的结果集合[^1]。 --- #### 方法二:回溯法 回溯法利用深度优先搜索的思想,在每次决策时尝试所有可能的选择,并在不满足条件时撤销当前选择以继续探索其他路径。 ```python class Solution: def permute(self, nums: list[int]) -> list[list[int]]: def backtrack(start=0): if start == len(nums): result.append(nums[:]) return for i in range(start, len(nums)): nums[start], nums[i] = nums[i], nums[start] backtrack(start + 1) nums[start], nums[i] = nums[i], nums[start] result = [] backtrack() return result ``` 此方法的核心在于交换元素位置并通过递归来完成整个过程。它避免了显式的拷贝操作,从而提高了效率[^2]。 --- #### 方法三:字典序算法 字典序算法可以按特定顺序依次生成下一个排列组合,适合于需要连续输出多个排列的情况。 虽然该方法较难理解,但它具有较高的性能优势,尤其是在处理大规模数据集时表现出色。 ```python from typing import List def next_permutation(nums: List[int]): n = len(nums) k = -1 for i in range(n-2, -1, -1): if nums[i] < nums[i+1]: k = i break if k == -1: nums.reverse() return False l = -1 for j in range(n-1, k, -1): if nums[j] > nums[k]: l = j break nums[k], nums[l] = nums[l], nums[k] nums[k+1:] = reversed(nums[k+1:]) return True def generate_all_permutations(nums: List[int]): results = [nums[:]] while next_permutation(nums): results.append(nums[:]) return results ``` 这段代码实现了基于字典序的全排列生成器[^4]。 --- #### 方法四:内置库函数 Python 的标准库提供了非常方便的功能可以直接用来解决此类问题。 ```python import itertools L = [1, 2, 3] permutations = list(itertools.permutations(L)) print(permutations) ``` 这里借助了 `itertools.permutations()` 来快速获得目标序列的所有排列形式[^3]。 --- ### 总结 以上介绍了四种不同的实现方案——递归法、回溯法、字典序算法以及使用内置库函数的方法。每一种都有其适用场景和特点,开发者可以根据实际需求选取最适合的一种。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值