No conozco una solución mejor que O (n ^ 2), y eso es fácil de lograr.
Aquí hay un fragmento de código (Java) que calcula el número de triples en el tiempo O (n ^ 2), suponiendo que no haya duplicados en la lista y que todos los números sean positivos.
Set X = new HashSet(); for(int i=0; i<n; i++) { X.add(A[i]*A[i]); } int ans = 0; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(X.contains(A[i]*A[i]+A[j]*A[j])) { ans++; } } }
La única observación no trivial es que podemos usar una tabla hash para decidir si se puede completar un triple dados los primeros dos elementos en O (1), que es cómo vencemos al algoritmo trivial O (n ^ 3).
Si hay duplicados, entonces debe reemplazar X con una estructura que cuenta el número de ocurrencias de un elemento en una matriz. Si su matriz contiene “0”, este fragmento da respuestas falsas (considere la matriz [0,1]), pero ningún triplete válido sin duplicados contiene 0, así que simplemente ignore los “triples” que contienen 0.
- ¿Cuál es el algoritmo más rápido para calcular la raíz cuadrada entera de un número?
- Dado un conjunto de números naturales [matemáticos] n [/ matemáticos], encuentre los dos subconjuntos de números ‘k’, cuya suma es [matemática] S_k [/ matemática], que minimizan la diferencia entre estas sumas. ¿Cómo lo resuelves con programación dinámica?
- ¿Existe un algoritmo matemático para crear música agradable?
- ¿Puede haber una función generadora de números primos?
- ¿Qué algoritmo básico podría enseñarle a mi hijo de 12 años?