Dada una matriz de enteros distintos, ¿encuentra 8 elementos que suman un número dado?

Puede probar una variación de la búsqueda de profundidad primero (DFS) de los algoritmos de gráficos.

def find_sum_DFS (lst, objetivo, n):
si n == 1:
volver [[gol]] si gol en lst más []
más:
res = []
para x en lst:
res + = [[x] + y
para y en find_sum_DFS (lst, goal-x, n-1)
Si y ]
volver res

def find_elem_sum_to_DFS (lst, objetivo, n):
lst_s = ordenado (lst)

R = find_sum_DFS (lst_s, objetivo, n)
S = conjunto (tupla (ordenada (x)) para x en R)

devoluciones

L = [10, 2, 6, 3, 4, 9, 0, 1, 7, 6, 8, 5, 14, 234, 1124]
T, N = 36, 8

S = find_elem_sum_to_DFS (L, T, N)
para r en ordenados (lista (S)): print (r)

Ejecutar el programa anterior da los siguientes resultados:

(0, 1, 2, 3, 4, 5, 7, 14)
(0, 1, 2, 3, 4, 6, 6, 14)
(0, 1, 2, 3, 4, 7, 9, 10)
(0, 1, 2, 3, 5, 6, 9, 10)
(0, 1, 2, 3, 5, 7, 8, 10)
(0, 1, 2, 3, 6, 6, 8, 10)
(0, 1, 2, 3, 6, 7, 8, 9)
(0, 1, 2, 4, 5, 6, 8, 10)
(0, 1, 2, 4, 5, 7, 8, 9)
(0, 1, 2, 4, 6, 6, 7, 10)
(0, 1, 2, 4, 6, 6, 8, 9)
(0, 1, 2, 5, 6, 6, 7, 9)
(0, 1, 3, 4, 5, 6, 7, 10)
(0, 1, 3, 4, 5, 6, 8, 9)
(0, 1, 3, 4, 6, 6, 7, 9)
(0, 1, 3, 5, 6, 6, 7, 8)
(0, 2, 3, 4, 5, 6, 6, 10)
(0, 2, 3, 4, 5, 6, 7, 9)
(0, 2, 3, 4, 6, 6, 7, 8)
(1, 2, 3, 4, 5, 6, 6, 9)
(1, 2, 3, 4, 5, 6, 7, 8)

Suponga que quiere encontrar 8 números que sumen k.

Primero, tome su matriz y reste [math] \ frac {k} {8} [/ math] de cada elemento. En realidad, esto no es necesario, pero hace que alguna notación sea conveniente porque ahora queremos números que sumen 0.

Cree una matriz con todas las sumas posibles de 4 números de su matriz. Llámalo Arr4. Aquí es donde entra el espacio [matemático] O (N ^ 4) [/ matemático]. Ordene esta matriz.

Hasta ahora, es [matemáticas] O (N ^ 4 \ log (N)) [/ matemáticas].

Ahora solo tenemos que encontrar un número [math] x [/ math] en Arr4 para el cual [math] -x [/ math] también está en Arr4. Para hacer esto, podemos tomar el enfoque ingenuo de, para cada número positivo [matemáticas] x [/ matemáticas], hacer una búsqueda binaria para buscar [matemáticas] -x [/ matemáticas]. ¡Esto se completa también en [matemáticas] O (N ^ 4 \ log (N)) [/ matemáticas]!

Entonces, el tiempo de ejecución general es [matemática] O (N ^ 4 \ log (N)) [/ matemática]

Este fue solo un trabajo de pirateo rápido y probablemente pueda mejorarse.

Por supuesto, si no puedes reutilizar elementos, solo debes tener cuidado con eso en cada paso. No es difícil, pero no lo olvides.

Puede resolver este problema mediante programación dinámica.

Deje F [num] [i] [j] = número de formas que usan j elementos en i primeros elementos en la matriz y la suma de sus es igual a num. Puede ver fácilmente que la fórmula para F es:

  • F [num] [i] [j] = F [num] [i – 1] [j] + F [num – Arr [i]] [i – 1] [j – 1].
  • F [0] [0] [0] = 1;

(Suponga que los elementos de la matriz están numerados de 1, N es un tamaño de matriz).

Si F [Número] [N] [8]> 0, significa que existe una forma de elegir 8 elementos de la matriz y la suma de ellos es igual a un número. Puede encontrar 8 elementos a través de la matriz de F.

Espacio de memoria: O (Número * N * 8).

Complejidad: O (Número * N * 8).

Me parece que no puedes hacerlo mejor (bueno, está bien, supongo que en la versión sin espacio puedes bajar a n ^ 7 * log n aplicando primero una clasificación de espacio constante y luego buscando la última octava posibilidad 😀 😀 ) – si alguien lo resolvió mejor que O (N ^ 4), me parecería que probablemente debería significar que su solución puede resolver en particular 3SUM – Wikipedia más rápido que O (n ^ 2) y estamos bastante convencidos de que uno puede No resuelva 3 sumas mejor que eso.

More Interesting

¿Se está preparando una sexta edición de Cracking the Coding Interview? Si es así, ¿qué podemos esperar de él?

¿Tenemos que prepararnos para una entrevista tecnológica? Me preparo para las entrevistas, pero los entrevistadores hacen otras preguntas.

¿Cuál es la mejor manera de prepararse para la entrevista de Google en 3 meses?

Dada una matriz de n números, ¿cuál es el algoritmo para encontrar la cantidad total de subsecuencias de la matriz que están en progresión aritmética?

¿Cómo te sientes cuando crees que te has desempeñado increíblemente bien en una entrevista pero aún te rechazan?

¿Cuáles son buenas preguntas de entrevista para una pasantía?

¿Qué efecto tiene terminar una entrevista antes de tiempo en los desarrolladores de software y su opinión de la compañía después?

¿Conocer solo las estructuras de datos básicos y los algoritmos no es suficiente para descifrar las entrevistas más técnicas en las grandes empresas?

Dado su enfoque en estructuras de datos y algoritmos escalables, ¿es subóptimo elegir R sobre Python para la entrevista técnica en grandes empresas tecnológicas?

Cómo mejorar mi proceso de pensamiento para las entrevistas de codificación

Durante las entrevistas de codificación de pizarra, puedo escribir algoritmos correctos para casos generales, pero no puedo manejar los casos de esquina. ¿Qué tan malo es y cómo lo supero?

¿Podría alguien explicar cómo este código dicta si la cadena tiene todos los caracteres únicos o no?

Tengo una semana antes de una entrevista telefónica con IONOS Networks. ¿Qué tipo de preguntas debo esperar?

¿Cuál es la lógica para aplicar la gravedad a un vector?

Soy bueno en DS, algoritmos y programación competitiva. Pero no he hecho buenos proyectos. ¿Cómo trato con las entrevistas de colocación?