给出一组数字,返回该组数字的所有排列
例如:
[1,2,3]的所有排列如下
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)
数据范围:数字个数
要求:空间复杂度
,时间复杂度
[1,2,3]
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
[1]
[[1]]
class Solution: def permute(self, num: List[int]) -> List[List[int]]: return [[]] if not num else [ [num[i]] + l for i in range(len(num)) for l in self.permute(num[0:i] + num[i+1:]) ]
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param num int整型一维数组 # @return int整型二维数组 # class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here if len(num)==1: return [num] u=[] for i in range(len(num)): j=num[:i]+num[i+1:] k=self.permute(j) for j in k: u.append([num[i]]+j) return u
class Solution: def permute(self , num: List[int]) -> List[List[int]]: num_len = len(num) if num_len == 0: return [] elif num_len == 1: return [num] elif num_len == 2: return [[num[0],num[1]],[num[1],num[0]]] res = [] for i in range(num_len): extra_arr = [num[x] for x in range(num_len) if x != i] res.extend([[num[i]]+p for p in self.permute(extra_arr)]) return res
class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here if (len(num)) < 2: return [num] if len(num) == 2: return [[num[0], num[1]], [num[1], num[0]]] output = [] for i in range(len(num)): new_num = num[:i] + num[i+1:] cur = self.permute(new_num) for j in cur: output.append([num[i]] + j) return output递归到元素为 2 的情况就可以了。
class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here if len(num) == 0 : return [] if len(num) == 1: return [num] res = [] cur = [] def backtrack(num): if len(cur) == len(num): tmp = cur.copy() #必须copy,否则tmp的值为最终递归完毕后cur的值:[] res.append(tmp) print(cur) return for i in range(len(num)): if num[i] in cur: continue cur.append(num[i]) backtrack(num) cur.pop(-1) backtrack(num) print(res) return res
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param num int整型一维数组 # @return int整型二维数组 # class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here ans=[] #存放全部结果的数组 lens=len(num) cur = [0 for i in range(lens)] #存放全排列的数组‘】 #permutation函数的意思是将num里面的数据进行全排列 #排列的结果放在同样长度的cur表里面 #当前函数执行的意思是,从nums数组里面选择一个数字放入cur[pos]里面 def permutaltion (pos,lens,num,cur): if (pos==lens): ans.append([i for i in cur]) #排列结束,到达边界,加入结果数组 return for i in range(lens): #尝试将num[i]放入cur[pos]中 flag=0 #标记位 for j in range(pos):#如果在nums[i]已经存在于cur[0..pos-1]中,则置1 if cur[j]==num[i]: #因为一个数字在cur数组中只允许出现一次 flag=1 #如果已经出现,那么就要继续遍历nums数组找到合适的数字 if flag==0: #没有置1,证明nums[i]还未出现,可以选择 cur[pos]=num[i] #将nums[i]放入cur[pos]中 permutaltion(pos+1,lens,num,cur) #cur[0..pos]都已经安排好,所以下一次迭代需要为cur[pos+1]找到合适的数字 permutaltion(0,lens,num,cur) return ans
class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here ans, path = [], [] def dfs(num, vis): if len(path) == len(num): ans.append(path[:]) return for i in range(len(num)): if not vis[i]: path.append(num[i]) vis[i] = True dfs(num, vis) vis[i] = False path.pop() vis = [False] * len(num) dfs(num, vis) return ans
class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here n = len(num) def messsort(res:list[list[int]],arr:list,index:int): if index == len(arr) - 1: list2 = [ ] for i in arr: list2.append(i) res.append(list2) else: for i in range(index,len(arr)): cur = arr[index] arr[index] = arr[i] arr[i] = cur messsort(res,arr,index + 1) cur = arr[index] arr[index] = arr[i] arr[i] = cur return res = [ ] messsort(res,num,0) res.sort() return res在写的时候遇到过append到列表里的东西居然被改写了,查了半天发现是往列表里append了一个指针。最后把需要append的东西重写了一边放进列表才解决问题。
import copy class Solution: def permute(self , num: List[int]) -> List[List[int]]: # write code here s=[] def a(num,layer): nonlocal s if layer == len(num): s.append(num) else: for j in range(layer, len(num)): temp = num[layer] num[layer] = num[j] num[j] = temp a(copy.deepcopy(num),layer+1) a(num,0) return s
递归 + 回溯 不回溯的话num还停留在上一次递归排列的状态,可能会导致出现漏排的情况
时间复杂度:O(n!) 空间复杂度:O(n) 递归栈的深度
还有注意添加排列好的num时使用深拷贝
import copy class Solution: def recursion(self, num, res, index): if index == len(num) - 1: res.append(copy.deepcopy(num)) else: for i in range(index, len(num)): temp = num[i] num[i] = num[index] num[index] = temp self.recursion(num, res, index+1) temp = num[i] num[i] = num[index] num[index] = temp def permute(self , num: List[int]) -> List[List[int]]: num.sort() res = [] self.recursion(num, res, 0) return res