Permutación algorítmica de rutina y combinación en profundidad Primera búsqueda

Tabla de contenido

0 Artículo Introducción

1 rutina dfs

2 permutación

2.1 Dada una matriz, sin números repetitivos, permutaciones que no son repetitivas

2.2 Dada una matriz, hay números repetitivos, permutaciones que no son repetitivas

2.3 Dada una matriz, sin número repetido, permutación reutilizable

3 combinaciones

3.1 Dada una matriz, sin números repetitivos, combinaciones que no son repetitivas

3.2 Dada una matriz, sin números repetitivos, combinaciones reutilizables

3.3 Dada una matriz, hay números repetidos y combinaciones que no se repiten (difícil)


0 Artículo Introducción

Este artículo utiliza el lenguaje Python para presentar el problema de permutación y combinación de la búsqueda en profundidad en el algoritmo con el tema en leetcode.

Divido permutación y combinación en 3 situaciones

  1. Sin repetición, sin repetición
  2. Sin repetición, se puede reutilizar
  3. Hay números repetitivos, no repetitivos.

Según la permutación y la combinación, debe haber 4 tipos, y hay números repetidos, que se pueden usar repetidamente. En este caso, primero quite los números repetidos y vuelva al tercer caso.

1 rutina dfs

对于每一种情况x:
	dfs(x)
  
def dfs(x):
	if 情况x不满足当前条件:
      return
    
    if x是最后一个元素了:
      搜到了,做操作
      return
    
    标记x情况搜过了
    for y in 由x衍生出的其他条件:
      dfs(y)
    标记x情况没搜过

 

2 permutación

2.1 Dada una matriz, sin números repetitivos, permutaciones que no son repetitivas

Puede invertir el orden de la matriz

46. ​​Arreglo completo-LeetCode

Pregunta: Dada una matriz sin números repetidos, devuelve todas las permutaciones

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def dfs(i):
            if i==n: ans.append(nums.copy())
            for x in range(i,n):
                nums[i],nums[x]=nums[x],nums[i]
                dfs(i+1)
                nums[i],nums[x]=nums[x],nums[i]
        n=len(nums)
        ans=[]
        dfs(0)
        return ans

2.2 Dada una matriz, hay números repetitivos, permutaciones que no son repetitivas

47. Arreglo completo II-LeetCode (leetcode-cn.com)

Pregunta: Dada una matriz con números repetidos, devuelve todas las permutaciones

Solo asegúrese de que el valor de la posición actual no aparezca antes. Pon los elementos en el dict, la clave es el elemento y el valor es el número de ocurrencias, basta con recorrer el dict cada vez.

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        def dfs(i):
            if i==n: ans.append(nums.copy())
            for x in range(i,n):
                nums[i],nums[x]=nums[x],nums[i]
                dfs(i+1)
                nums[i],nums[x]=nums[x],nums[i]
        n=len(nums)
        ans=[]
        dfs(0)
        return ans

2.3 Dada una matriz, sin número repetido, permutación reutilizable

377. Suma combinada IV

Este es un problema de mochila completo, que es un problema parcial.

Pregunta: Dada una matriz compuesta por números enteros positivos y sin números repetidos, encuentre el número de combinaciones cuya suma es el entero positivo objetivo dado.

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp=[0]*(target+1)
        dp[0]=1
        for i in range(target+1):
            for num in nums:
                if i>=num:
                    dp[i]+=dp[i-num]
        return dp[target]

3 combinaciones

La disposición relativa de la combinación es mucho más simple, no es necesario considerar el orden, solo considere si existe este elemento.

3.1 Dada una matriz, sin números repetitivos, combinaciones que no son repetitivas

216. Suma combinada III

Significado de la pregunta: Encuentre todas las combinaciones de k números que sumen n. Solo se permiten números enteros positivos del 1 al 9 en la combinación y no hay números repetidos en cada combinación.

Nota: Todos los números son números enteros positivos. El conjunto de soluciones no puede contener combinaciones repetidas. 

Respuesta: La primera búsqueda de profundidad normal está bien

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        def dfs(num,tmpsum):
            if len(tmp)==k:
                if tmpsum==n:ans.append(tmp.copy())
                return
            elif tmpsum>n:return
            for i in range(num,10):
                tmp.append(i)
                dfs(i+1,tmpsum+i)
                tmp.pop()
        ans,tmp=[],[]     
        dfs(1,0)
        return ans

3.2 Dada una matriz, sin números repetitivos, combinaciones reutilizables

39. Suma de combinación

El significado de la pregunta: Dada una matriz de candidatos sin elementos repetidos y un objetivo de número objetivo, averigüe todas las combinaciones de candidatos que pueden hacer el número y el número objetivo. Los números de los candidatos se pueden seleccionar repetidamente sin limitación.

Respuesta: debido a que puede seleccionar elementos repetidamente, puede modificar ligeramente el siguiente método de búsqueda en profundidad

class Solution:
    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
        def dfs(idx,total):
            if total==target:ans.append(tmp.copy())
            elif total>target:return
            for i in range(idx,n):
                tmp.append(candidates[i])
                dfs(i,total+candidates[i])
                tmp.pop()
        candidates.sort()
        n=len(candidates)
        ans,tmp=[],[]
        dfs(0,0)
        return ans

3.3 Dada una matriz, hay números repetidos y combinaciones que no se repiten (difícil)

40. Suma de combinación II

Dada una variedad de candidatos y un objetivo de número objetivo, averigüe todas las combinaciones de candidatos que pueden hacer el objetivo de suma de números.

Cada número de candidatos solo se puede usar una vez en cada combinación.

Análisis: La dificultad de esta pregunta es que si hay 1,1,1,3, objetivo = 5. Hay 3 combinaciones de dos 1 que forman 5, pero son iguales y deben combinarse. El funcionamiento de esta pregunta es que los elementos repetidos solo pueden ser barridos en la primera pasada. En otras palabras, hay un 1 en el elemento constitutivo, y este 1 proviene de la posición del primer 1 y busca hacia atrás normalmente. Hay un 1 en el elemento de composición, y este 1 no es de la posición del primer 1, luego abandone la búsqueda y busque la posición del primer número que no sea 1.

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        def dfs(idx,total):
            if total>target:return
            elif total==target:
                ans.append(tmp.copy())
                return
            for i in range(idx,n):#重复的只允许第一遍扫过去
                if i>idx and candidates[i]==candidates[i-1]:continue
                tmp.append(candidates[i])
                dfs(i+1,total+candidates[i])
                tmp.pop()
        candidates.sort()
        n=len(candidates)
        tmp,ans=[],[]
        dfs(0,0)
        return ans

 

Supongo que te gusta

Origin blog.csdn.net/nanfeizhenkuangou/article/details/111301790
Recomendado
Clasificación