Directorio de artículos
1. Permutación completa de arreglos sin números repetidos
1.1 Tema
Dada una matriz nums sin números repetidos, devuelva todas las permutaciones completas posibles de la misma. Puede devolver las respuestas en cualquier orden.
Ejemplo 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Ejemplo 2:
输入:nums = [1]
输出:[[1]]
1.2 Método recursivo
código:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def backtrack(subArray,curArray):
if not subArray:
ans.append(curArray)
return
else:
for i in range(len(subArray)):
backtrack(subArray[:i]+subArray[i+1:],curArray+[subArray[i]])
ans=[]
backtrack(nums,[])
return ans
1.3 Método clásico: búsqueda + retroceso
código:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def dfs(nums, path):
if not nums:
ans.append(path)
return
nums_copy = copy.deepcopy(nums)
for num in nums_copy:
nums.remove(num)
dfs(nums, path + [num])
nums.append(num)
ans =[]
dfs(nums,[])
return ans
2. Permutación completa de arreglos que contienen números repetidos
2.1 Temas
Dada una secuencia de números que pueden contener números repetidos, devolver todas las permutaciones completas no repetidas en cualquier orden.
Ejemplo 1:
输入:nums = [1,1,2]
输出:[[1,1,2], [1,2,1], [2,1,1]]
Ejemplo 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
2.1 Solución aproximada: primero organice el todo y luego elimine los duplicados, la complejidad del tiempo es alta
La idea más simple es agregar un paso al código de 1.2 para determinar si la ruta está en ans, pero la complejidad de tiempo para determinar si una lista está en otra lista es muy alta, lo que resulta en un tiempo de ejecución prolongado, que puede exceder el límite de tiempo cuando hay más casos de prueba.
código:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
def backtrack(nums,path):
if not nums:
if path not in ans:
ans.append(path)
return
else:
for i in range(len(nums)):
backtrack(nums[:i]+nums[i+1:],path+[nums[i]])
ans=[]
backtrack(nums,[])
return ans
Resultados de la:
执行用时:736 ms, 在所有 Python3 提交中击败了 11.89% 的用户
内存消耗:16.4 MB, 在所有 Python3 提交中击败了 21.76% 的用户
2.2 Solución exquisita: primero elimine los duplicados y luego organícelos por completo, búsqueda + retroceso + poda
código:
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
def dfs(nums, path):
if not nums:
ans.append(path)
return
temp = list(set(nums))
for num in temp:
nums.remove(num)
dfs(nums, path + [num])
nums.append(num)
ans=[]
dfs(nums,[])
return ans
Resultados de la:
执行用时:56 ms, 在所有 Python3 提交中击败了 47.70% 的用户
内存消耗:16.5 MB, 在所有 Python3 提交中击败了 20.45% 的用户