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.
- Para las entrevistas en el campus, ¿por qué las empresas realizan entrevistas de codificación en línea en HackerRank o CodeChef?
- ¿Por qué usar Java sobre C? (mejor respuesta para entrevista)
- ¿Se está preparando una sexta edición de Cracking the Coding Interview? Si es así, ¿qué podemos esperar de él?
- ¿Está predispuesto Facebook hacia los candidatos a entrevistas que son los mejores clasificados en las competencias de programación en línea?
- ¿Cuáles son las mejores preguntas que hacen los entrevistadores en la entrevista relacionada con C, si va a realizar una entrevista de la compañía 5-6 CTC?
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]); } }