👨💻Explicación del Algoritmo
Por si necesitas entender lo que pasó, trataré de explicarlo:
.
(1) Daré por hecho que entendiste hasta la condición nums[mitad] == objetivo
.
.
(2) Después deberás identificar si una mitad está ordenada o rotada. Una mitad está ordenada si la posición mitad
es menor o igual que la posición derecha
(nums[mitad] <= nums[derecha]
), o lo contrario (nums[izq] <= nums[mitad]
).
#L M R
[4,5,6,1,2,3,4] # mitad = 3
[1,2,3,4] #Ordenada
[4,5,6,1] #Rotada
.
(3) Si lo evaluado está ordenado desde la mitad a la derecha, entonces debemos identificar si el objetivo
está dentro del intervalo [mitad,derecha]
, es decir, (nums[mitad] <= obj && nums[derecha] >= obj
), si está dentro, entonces cambiamos el valor de izquierda
por mitad + 1
, si no se cumple, entonces cambiamos el valor de derecha
por mitad - 1
. También se puede evaluar si el objetivo está fuera del intervalo ordenado, pero es algo que te lo dejo de tarea.
.
(4) Si lo evaluado no está ordenado desde la mitad a la derecha, quiere decir que está ROTADO. Por lo tanto, realizamos lo mismo que el anterior paso, teniendo en cuenta que lo demás está ORDENADO, desde la izquierda a la mitad. Entonces evaluamos si el objetivo
está en el intervalo [izq,mitad]
, es decir, (nums[izq] <= obj && nums[mitad] >= obj
), si lo está derecha = mitad -1
, caso contrario izq = mitad +1
.
.
En conclusión, debes identificar si los elementos desde la mitad a la derecha están ordenados o rotados, después evaluar si el objetivo está en el intervalo ordenado o rotado y según eso mover los apuntadores izquierda
y derecha
según corresponde. Es por eso que el código tiene dos if
anidados dentro de un if/else
.
.
Comparto la solución cuando se evalúa que el objetivo esté en el intervalo rotado.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?