【LeetCode】46,47 Temperatura diaria. Nivel de dificultad: Moderado. Comprensión de la búsqueda + retroceso

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% 的用户

Supongo que te gusta

Origin blog.csdn.net/qq_43799400/article/details/131744374
Recomendado
Clasificación