Problema: Ingrese un entero x que contenga n enteros que sea una matriz A, encuentre i y j que satisfagan A [i] + A [j] = x, y si no hay tal suma de elementos, devuelva -1 y -1.
Mi análisis es el siguiente:
Es necesario tener en cuenta esta pregunta: puede haber elementos duplicados en la matriz y hay más de un conjunto de soluciones que cumplen con las condiciones .
Por ejemplo, dada la matriz A [1,3,2,2] yx = 4, la solución que satisface la condición es
(0, 1): 1 + 3 = 4 y (2, 3): 2 + 2 = 4.
Solución 1: solución violenta
Itere sobre cada elemento A [i] y encuentre si hay un elemento objetivo con un valor igual a xA [i].
Casos de prueba y resultados de ejecución:
Solución 2: Ordenar primero + puntero + HashMap
Ordene primero la matriz dada y luego cree dos punteros (i, j), uno desde el nodo inicial hasta la parte posterior de i ++, y uno desde el nodo de cola hasta el frente de j--;
Hay tres casos:
int i = 0, j = A.length;
while(i < j) {
if(A[i]+A[j] < x)
i++;
else if(A[i]+A[j] > x)
j--;
else
System.out.print("find out!");
}
Sin embargo, el índice de la matriz se confundirá debido a la reordenación. Por lo tanto, los elementos de la matriz original y sus índices se pueden almacenar en la tabla hash antes de ordenarlos. Después de que los elementos se encuentran con el puntero, el índice original se puede extraer a través de la tabla hash.
Análisis de la complejidad del tiempo, la tabla hash de acceso es O (n), el orden es O (nlog (n)) y la búsqueda de puntero es O (n), que se trata de O (2n + nlog (n)).
Solución 3: tabla hash
hm: Almacene los elementos e índices en la matriz en forma de <clave, valor> en la tabla hash hm (optimizado gradualmente desde atravesar la tabla hash dos veces hasta atravesar la tabla hash una vez)
(1) El primer pensamiento es atravesar la tabla hash dos veces: f (n) = 2n
* La primera vez es almacenar cada elemento en la matriz y su índice en una tabla hash en forma de pares clave-valor
* La segunda vez es atravesar cada elemento A [i] a su vez para ver si xA [i] es una clave en la tabla hash. Si existe, el valor clave es el índice.
Pero el problema con esta situación es: porque el recorrido generará la solución dos veces, como (1, 2) y (2, 1).
(2) Las dos tablas de hash transversales anteriores se pueden cambiar en una transversal f (n) = n, es decir, antes de agregar el elemento de matriz a [i] a la tabla de hash, primero determine si xa [i] ya está en el hash actual En la tabla, y luego agregue, para que no haya una solución de salida duplicada.
* La tabla hash intercambia espacio por tiempo, la complejidad del espacio es O (n), la complejidad del tiempo es O (n)
* Desventajas: las claves duplicadas no están permitidas en la tabla hash, por lo que este algoritmo no puede resolver la situación del mismo elemento en la matriz.
Nota: Algunos problemas indicarán que solo hay un par de soluciones de este tipo. Esta situación es relativamente simple. No necesita considerar elementos repetidos y puede finalizar el programa siempre que encuentre la solución.