一.问题描述
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
二.解题思路
主要是有两种思路:
1,数组长度为n,后面i~n的子数组已完成全排列,我们慢慢向前推进,接下来把nums[i-1]加进去,来完成新子数组的全排列,方法就是把nums[i-1]插入i~n子数组所有全排列的结果中的每个可能位置,这种思路适合用递归实现,但是如果实现得不好会有很多多余计算,会在第三部分讨论。
2,数组长度为n,前面0~n的子数组已完成全排列,我们慢慢向后推进,接下来把nums[i+1]加进去,来完成新子数组的全排列,方法就是把nums[i+1]插入0~n子数组所有全排列的结果中的每个可能位置,这种思路适合用迭代实现。
时间复杂度:O(N*N*N), 空间复杂度:(N!*N)
更多leetcode算法题解法: 专栏 leetcode算法从零到结束 或者 leetcode 解题目录 Python3 一步一步持续更新~
三.源码
1.迭代
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
n=len(nums)
if n==0 or n==1:return [nums]
rst=[[nums[0]]]
for i in range(1,n):
rst=[rst[t][:k]+[nums[i]]+rst[t][k:] for t in range(len(rst)) for k in range(len(rst[t])+1)]
return rst
2.递归
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
if not nums:
return []
if len(nums) == 1:
return [nums]
if len(nums) == 2:
return [nums, nums[::-1]]
result = [[x] + y for i, x in enumerate(nums) for y in self.permute(nums[:i] + nums[i+1:])]
'''
上面result这步包含了许多重复计算
这份代码的实现思路是,
对于一个nums数组,迭代将nums中的每个元素放在最前面,
然后和剩下的所有元素的全排列拼接,
方法是很直观,但是这份实现没有利用到任何之前已经完成的迭代的信息,
比如过对于一个数组[1,2,3,4,5,6],
我首先把1放在开头,然后求出[2,3,4,5,6]的全排列,拼接,
之后,我把2放在开头,求[1,3,4,5,6]的全排列,
然而,其实[3,4,5,6]的全排列在第一次求1开头的时候就已经求出来了,
但是这份实现完全没有利用到这个信息,
改善的话可以用变量存储已经求得的结果,用空间换时间
'''
return result
本文深入探讨了LeetCode上的一道经典算法题——全排列问题。提供了两种解题思路,一种是递归实现,另一种是迭代实现。详细解释了每种方法的原理,并给出了Python代码示例。同时,分析了不同实现方式的时间和空间复杂度。
521

被折叠的 条评论
为什么被折叠?



