Puede hacerlo en tiempo lineal en una matriz ordenada. Suponiendo [matemáticas] i <j [/ matemáticas], entonces si [matemáticas] a_i + a_j \ ge k [/ matemáticas], [matemáticas] a_i + a_ {j + 1} \ ge k [/ matemáticas] y [matemáticas] a_ {i + 1} + a_j \ ge k [/ math] también. Por lo tanto, para cualquier [matemática] i [/ matemática], solo necesita encontrar la [matemática] j [/ matemática] más baja, para la cual la condición ya no es verdadera, y agregar [matemática] N – j [/ matemática] (suponiendo que la indexación de [matemática] 1 [/ matemática] a [matemática] N [/ matemática], ajuste en consecuencia para el origen [matemática] 0 [/ matemática]) al total.
Un ejemplo para aclarar. Encontremos el número de pares que suman al menos 5:
1, 1, 2, 3, 5, 8 ija [i] + a [j]> = 5 1, 1, 2, 3, 5, 8 ija [i] + a [j]> = 5 1, 1, 2, 3, 5, 8 ija [i] + a [j] <5, cuenta + = 2 para un total de 2 1, 1, 2, 3, 5, 8 ija [i] + a [j] = 5 1, 1, 2, 3, 5, 8 ij i == j, cuenta + = 3 para un total de 7
Una vez que ambos índices coinciden, significa que cualquier combinación de los siguientes números producirá al menos k, por lo que ajustamos el total por [matemáticas] N – i – 1 [/ matemáticas] -th número triangular [1] (segundo número triangular en este caso, que es 3, para un total de 10).
- ¿Qué tipo de preguntas se harán durante las entrevistas de TI para otros estudiantes de la rama?
- ¿Es éticamente correcto que una empresa tenga una entrevista de codificación de 5 a 8 horas mientras pasan quince minutos encontrando fallas que una prueba de codificación de 1 hora también habría revelado?
- Si hay una matriz que contiene N números, cuyo rango es de 1 a N + 1, y solo puedo usar el espacio O (1) y no puedo modificar la matriz, ¿puedo encontrar cualquier número repetido no peor que O (NlogN) ¿hora?
- ¿Resolver 3000 preguntas de algoritmos en 3 años es suficiente para prepararse para las entrevistas de Google y Facebook?
- ¿Cómo puede determinar eficientemente el k-ésimo elemento máximo en una matriz ordenada MxN?
Aquí están los diez pares que suman al menos 5 solo para verificar:
1 + 8, 1 + 5, 1 + 8, 1 + 5, 2 + 8, 2 + 5, 2 + 3, 3 + 8, 3 + 5, 5 + 8
Y aquí están los cinco pares que no:
1 + 1, 1 + 2, 1 + 3, 1 + 2, 1 + 3
El recorrido de la matriz es obviamente [matemática] O (n) [/ matemática] porque en cada paso [matemática] j [/ matemática] disminuye o [matemática] i [/ matemática] aumenta. Se puede suponer que la corrección al final es [matemática] O (1) [/ matemática].
Para una matriz arbitraria, simplemente ordénela primero ([math] O (n \ log n) [/ math]) y luego aplique este algoritmo.
Notas al pie
[1] Número triangular – Wikipedia