El problema de la suma de dos números (encuentra los dos elementos en la matriz como los dos elementos del entero dado)

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.

61 artículos originales publicados · 61 alabanzas · 20,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_42475914/article/details/104743872
Recomendado
Clasificación