1、递归法:使用嵌套循环,每次迭代中交换一个元素的位置来得到下一个排列,基本思路是将问题分解为子问题,然后递归地解决这些子问题,Python代码如下:def permutations(arr, n): if n == 1: return [arr] else: result = [] for i in rang……...
1、递归法:使用嵌套循环,每次迭代中交换一个元素的位置来得到下一个排列,基本思路是将问题分解为子问题,然后递归地解决这些子问题,Python代码如下:
def permutations(arr, n): if n == 1: return [arr] else: result = [] for i in range(n): remaining = arr[:i] + arr[i+1:] sub_permutations = permutations(remaining, n-1) for sub_perm in sub_permutations: result.append([arr[i]] + sub_perm) return result 示例 arr = [1, 2, 3] permutations(arr, len(arr))
2、迭代法:使用栈或队列来保存待处理的元素,每次从当前未处理的元素中取出一个,与前面的所有元素进行交换,然后将这个元素压入栈或队列,Python代码如下:
from collections import deque def permutations(arr): def backtrack(index, path): if index == len(arr): result.append(path.copy()) else: for i in range(index, len(arr)): path.append(arr[i]) backtrack(index + 1, path) path.pop() result = [] backtrack(0, []) return result 示例 arr = [1, 2, 3] permutations(arr)
3、回溯法:这是一种动态规划方法,通过检查每个位置是否可以放置当前元素来避免重复计算,Python代码如下:
def permutations(arr): def backtrack(index): if index == len(arr): result.append(''.join(arr)) else: for i in range(index, len(arr)): arr[index], arr[i] = arr[i], arr[index] backtrack(index + 1) arr[index], arr[i] = arr[i], arr[index] # 回溯 result = [] backtrack(0) return result 示例 arr = [1, 2, 3] permutations(arr)
三种算法都可以得到n个不同元素的所有全排列,但时间复杂度上递归法和回溯法较高,为O(n!),而迭代法的时间复杂度为O(n^2),在实际应用中,如果n较大,可以考虑使用生成器或者并行计算来提高效率。