Mi solución se ejecuta en ejecuciones en tiempo O (N ^ 2) y se basa en el famoso problema 3SUM:
def pythagorean_triple (nums):
nums.sort ()
para ci en reversa (xrange (2, len (nums))):
ai = 0
bi = ci – 1
- ¿Cuáles son algunos métodos que se pueden usar para probar límites inferiores para los tiempos de ejecución de los algoritmos?
- ¿Cuáles son los conceptos fundamentales de la física?
- ¿Cuál es tu identidad favorita en combinatoria?
- ¿Cuál es el orden de las operaciones para la notación sigma?
- ¿Cuál es la mejor manera de transformar una secuencia de 0 y 1 en otra secuencia que tenga el mayor número posible de 0 y exista una forma de revertir la nueva secuencia?
mientras ai <bi:
pythagorean_sum = nums [ai] * nums [ai] + nums [bi] * nums [bi]
c_squared = nums [ci] * nums [ci]
if pythagorean_sum == c_squared:
regresar nums [ai], nums [bi], nums [ci]
elif pythagorean_sum <c_squared:
ai + = 1
más:
bi – = 1
EDITAR: El OP solicitó una explicación más exhaustiva.
El problema de 3SUM es encontrar tres números enteros a, byc en una matriz de manera que a + b + c = 0. Antes de explicar 3SUM, observe este problema.
Primero ordenamos los números. Tenga en cuenta que c siempre debe ser mayor que a y b. Por lo tanto, en la lista ordenada, c siempre estará a la derecha de a y b. Entonces, podemos iterar de derecha a izquierda para verificar cada posible c, y verificar cada posible a y b a la izquierda de la c.
Si quisiéramos, podríamos verificar todos los pares de números a y b a la izquierda de la c para ver si a ^ 2 + b ^ 2 = c ^ 2, pero eso sería lento. Podríamos hacer esto más rápido eligiendo solo ayb de modo que a esté a la izquierda de b, lo que nos permite hacer un truco especial. Supongamos que verificamos cada posible a comenzando desde el lado izquierdo y cada posible b comenzando desde el lado derecho mientras a <b. Aquí está la parte "crucial": si a ^ 2 + b ^ 2 c ^ 2, entonces b debe ser demasiado grande, para que podamos verificar con seguridad el siguiente b a la izquierda.
Esta optimización reduce el algoritmo de O (N ^ 3) a O (N ^ 2).
3SUM podría resolverse casi de la misma manera, excepto que uno verificaría si a + b + c es mayor, igual o menor que cero.