Cómo encontrar de manera óptima la suma máxima de un par de números en una matriz, módulo k

No quería dar esta respuesta porque sospecho que lo óptimo probablemente se puede hacer en tiempo lineal. Pero aquí hay un enfoque que puede hacerlo en aproximadamente O (n * log min (n, k)) que es más rápido que la respuesta actual que es O (n ^ 2). (suponiendo que el tamaño de la matriz es n).

Primero, preprocese para que cada elemento sea mod k (de modo que todo esté entre 0 yk – 1). Entonces este problema se reduce a encontrar el máximo de:
1) Dos números que suman un valor entre k y 2k – 2
2) Dos números que suman un valor entre 0 yk – 1

Esos son los dos únicos casos debido al preprocesamiento.

El primer caso serán los dos valores modificados más grandes de la matriz.
El segundo caso se puede resolver manteniendo todos los valores en un mapa ordenado y encontrando el valor complementario más grande (por ejemplo, si el valor actual es 1 yk = 5, debería buscar cualquier valor que sea menor que 4).

Código:

  import java.util. *;
 clase MaxSumMod {
  public static void main (String args []) {
   int arr [] = {1, 2, 1, 2, 6, 5};
   int k = 5;

   // Busca dos mod k más grandes
   int max_i = 0;
   para (int i = 0; i  = arr [max_i]% k) {
       max_i = i;
     }
   }
   int max_j = 0;
   para (int j = 0; j  = arr [max_j]% k) {
       max_j = j;
     }
   }
   int max_value = (arr [max_i] + arr [max_j])% k;

   // Busca dos que sumen menos de k
   TreeMap  position = new TreeMap  ();
   para (int i = 0; i <longitud de arr; i ++) {
     position.put (arr [i]% k, i);
   }
   para (int i = 0; i  max_value) {
       max_i = i;
       max_j = j;
       max_value = value;
     }
   }
   System.out.println (arr [max_i] + "" + arr [max_j]);
  }
 }

Podemos hacerlo en O (n) tiempo con un espacio extra.

1. Tome un HashMap con clave y valor como tipos enteros.
2. Revise la matriz dada y almacene el número y su repetición en el HashMap. Cuando establezca el valor de repetición, si es igual o mayor que 2, actualice la suma máxima (si es mayor que la suma anterior).
3. Obtendrá la suma máxima, una vez que se haya recorrido toda la matriz. Aquí está el código.

HashMap map = new HashMap(); int tempSum=0, maxSum=0; for(int i=0; i maxSum) { maxSum = tempSum; } } else { map.put(A[i], 1); } } system.out.println(maxSum); 

]

More Interesting

¿Algoritmo de libros o proyecto de código abierto para ser contratado por empresas tecnológicas de San Francisco como Google?

¿Cuáles son los fundamentos que debe saber antes de una entrevista técnica?

¿Cómo fue el proceso de entrevista para un puesto de pasantía en ingeniería de software con SoundCloud?

Cómo preparar aptitudes en dos días para una entrevista de software

¿Debo aprender estructuras de datos y algoritmos para realizar una entrevista para un trabajo relacionado con el aprendizaje automático?

Una persona tiene muchos amigos en Facebook. Dada una persona y un amigo, ¿cómo encuentro la mejor manera de determinar el camino entre ellos?

No me entrevistaron en absoluto en el programa Google STEP. ¿Hay algo mal conmigo?

¿Cómo podemos encontrar si una matriz, arr [], tiene dos índices distintos, i y j, donde abs (a [j] - a [i]) <= L y abs (j - i) <= K en O ( N) tiempo y O (K) espacio?

Dada una matriz, cuyos elementos son números positivos, ¿cuál es la suma máxima de una subsecuencia con la restricción de que no hay 2 números en la secuencia adyacentes a la matriz?

Cómo prepararse para una entrevista de colocación de Informatica

Cómo dominar la API de Java para obtener un trabajo como desarrollador de Java si solo olvido los detalles sobre los métodos, su clase y paquetes

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

¿Qué tipo de preguntas de codificación se hacen en las entrevistas para Docker, Inc.?

¿Qué tan útiles son las entrevistas prácticas remuneradas?

¿Qué preguntas puedo esperar recibir en una entrevista sobre Linux?