Dada la matriz de n enteros y dado un número X, encuentre todos los pares únicos de elementos (a, b), cuya suma es igual a X.
La siguiente es mi solución, es O (nLog (n) + n), pero no estoy seguro de si es o no óptimo.
int main(void)
{
int arr [10] = {1,2,3,4,5,6,7,8,9,0};
findpair(arr, 10, 7);
}
void findpair(int arr[], int len, int sum)
{
std::sort(arr, arr+len);
int i = 0;
int j = len -1;
while( i < j){
while((arr[i] + arr[j]) <= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
i++;
}
j--;
while((arr[i] + arr[j]) >= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
j--;
}
}
}
while((arr[i] + arr[j]) <= sum && i < j)
debe serwhile( i < J && arr[i] + arr[j] <= sum )
. (similar para el segundo subloop)Respuestas:
fuente
arr=[1,2,1,2,1,2,1,...]
. Para la unicidad por valor, parece que otra tabla hash con un par de valores sería suficiente. Sigue siendo una respuesta agradable, compacta y elegante. +1hash(K - arr[i]) != i
alguna manera verifica la presencia y la falta de una coincidencia? Esperaría que hubiera un cheque de presencia por separado.Hay 3 enfoques para esta solución:
dejar que la suma sea T yn sea el tamaño de la matriz
Enfoque 1:
la forma ingenua de hacer esto sería verificar todas las combinaciones (n elegir 2). Esta búsqueda exhaustiva es O (n 2 ).
Enfoque 2:
una mejor manera sería ordenar la matriz. Esto toma O (n log n)
Luego, para cada x en la matriz A, use la búsqueda binaria para buscar Tx. Esto tomará O (nlogn).
Entonces, la búsqueda general es O (n log n)
Enfoque 3:
La mejor forma sería insertar cada elemento en una tabla hash (sin ordenar). Esto toma O (n) como inserción de tiempo constante.
Luego, para cada x, podemos buscar su complemento, Tx, que es O (1).
En general, el tiempo de ejecución de este enfoque es O (n).
Puede consultar más aquí . Gracias.
fuente
Implementación en Java: uso del algoritmo de codaddict (tal vez un poco diferente)
Para entrada =
{2,45,7,3,5,1,8,9}
y si Sum es10
Pares de salida:
Algunas notas sobre la solución:
fuente
put(k-input[i], input[i])
(codaddicts pone el índice como valor que es útil). Lo que usted escribió puede simplificarsefor (i:input){ if (intSet.contains(sum-i) { print(i + "," + (sum-i) ); } else {intSet.add(i)}
Solución en java. Puede agregar todos los elementos de cadena a una ArrayList de cadenas y devolver la lista. Aquí solo lo estoy imprimiendo.
fuente
Implementación de Python:
Salida:
fuente
C ++ 11, complejidad del tiempo de ejecución O (n):
fuente
Aquí hay una solución que tiene en cuenta las entradas duplicadas. Está escrito en javascript y asume que la matriz está ordenada. La solución se ejecuta en tiempo O (n) y no utiliza memoria adicional aparte de la variable.
Resolví esto durante una entrevista para una gran corporación. Se lo llevaron pero yo no. Así que aquí está para todos.
Comience en ambos lados de la matriz y avance lentamente hacia adentro asegurándose de contar los duplicados si existen.
Solo cuenta pares, pero se puede reelaborar para
¡Disfrutar!
fuente
if(distI > distK) while(_arr[++i]==curI); else while(_arr[--k]==curK);
En)
Metodología: a + b = c, por lo que en lugar de buscar (a, b) buscamos a = c - b
fuente
Implementación en Java: utilizando el algoritmo de codaddict:
Salida:
Si desea pares duplicados (por ejemplo: 80,80) también, simplemente elimine && (Integer) mapping.get (ka [i])! = I de la condición if y estará listo para comenzar.
fuente
Acabo de atender esta pregunta en HackerRank y aquí está mi solución 'Objetivo C' :
Espero que ayude a alguien.
fuente
Esta es la implementación de O (n * lg n) usando la implementación de búsqueda binaria dentro de un bucle.
fuente
En pitón
fuente
Buena solución de Codeaddict. Me tomé la libertad de implementar una versión en Ruby:
Para permitir pares duplicados (1,5), (5,1) solo tenemos que eliminar la
&& !result[sum-l]
instrucciónfuente
Aquí hay un código Java para tres enfoques:
1. Usando Map O (n), HashSet también se puede usar aquí.
2. Ordene la matriz y luego use BinarySearch para buscar el complemento O (nLog (n))
3. BruteForce tradicional dos bucles O (n ^ 2)
fuente
Un programa simple en Java para matrices que tienen elementos únicos:
fuente
Un simple fragmento de código Java para imprimir los siguientes pares:
fuente
Otra solución en Swift: la idea es crear un hash que almacene valores de (sum - currentValue) y compare esto con el valor actual del bucle. La complejidad es O (n).
fuente
Mi solución - Java - Sin duplicados
fuente
Esto imprime los pares y evita duplicados usando manipulación bit a bit.
fuente
Pasé por alto la manuplación de bits y simplemente comparé los valores del índice. Esto es menor que el valor de iteración del bucle (i en este caso). Esto no imprimirá los pares duplicados y los elementos de matriz duplicados también.
fuente
C ª#:
fuente
Una solución puede ser esta, pero no óptima (la complejidad de este código es O (n ^ 2)):
fuente
Una versión simple de Python del código que encuentra una suma de pares de cero y puede modificarse para encontrar k:
La complejidad del tiempo de ejecución de la función es O (n) y Espacio: O (n) también.
fuente
fuente
la solución menor que o (n) será =>
fuente
Solución en Python usando la comprensión de listas
O (N 2 )
también da dos pares ordenados (a, b) y (b, a)
fuente
I am not sure … Thanks for comments
). Puede denotar la puñalada en la complejidad más cercana a O (n²).Puedo hacerlo en O (n). Avísame cuando quieras la respuesta. Tenga en cuenta que implica simplemente atravesar la matriz una vez sin ordenar, etc. También debo mencionar que explota la conmutatividad de la suma y no usa hashes sino que desperdicia memoria.
utilizando el sistema; usando System.Collections.Generic;
/ * Existe un enfoque O (n) mediante el uso de una tabla de búsqueda. El enfoque consiste en almacenar el valor en un "contenedor" que se puede buscar fácilmente (por ejemplo, O (1)) si es candidato para una suma adecuada.
p.ej,
para cada a [k] en la matriz simplemente la colocamos en otra matriz en la ubicación x - a [k].
Supongamos que tenemos [0, 1, 5, 3, 6, 9, 8, 7] yx = 9
Creamos una nueva matriz,
valor de índices
ENTONCES, los únicos valores importantes son los que tienen un índice en la nueva tabla.
Entonces, digamos que cuando alcanzamos 9 o igual, vemos si nuestra nueva matriz tiene el índice 9 - 9 = 0. Como lo sabemos, todos los valores que contiene se sumarán a 9. (tenga en cuenta que es obvio que solo hay 1 posible, pero puede tener múltiples valores de índice que necesitamos almacenar).
Entonces, efectivamente, lo que terminamos haciendo es tener que movernos a través de la matriz una sola vez. Como la suma es conmutativa, terminaremos con todos los resultados posibles.
Por ejemplo, cuando llegamos a 6 obtenemos el índice en nuestra nueva tabla como 9 - 6 = 3. Como la tabla contiene ese valor de índice, conocemos los valores.
Esto es esencialmente cambiar la velocidad por la memoria. * /
fuente
Solución Javascript:
fuente
https://github.com/clockzhong/findSumPairNumber
Lo hice bajo el costo de complejidad O (m + n) para el tiempo y el espacio de memoria. Sospecho que ese es el mejor algoritmo hasta ahora.
fuente
int [] arr = {1,2,3,4,5,6,7,8,9,0};
var z = (de a in arr de b in arr donde 10 - a == b seleccione new {a, b}). ToList;
fuente