Programa Python3 para la técnica de dos punteros

Dos punteros es realmente una técnica fácil y efectiva que se usa típicamente para buscar pares en una array ordenada.
Dada una array ordenada A (ordenada en orden ascendente), que tiene N enteros, encuentre si existe algún par de elementos (A[i], A[j]) tal que su suma sea igual a X.

Veamos la solución ingenua .  

Python3

# Naive solution to find if there is a
# pair in A[0..N-1] with given sum.
def isPairSum(A, N, X):
 
    for i in range(N):
        for j in range(N):
 
            # as equal i and j means same element
            if(i == j):
                continue
 
            # pair exists
            if (A[i] + A[j] == X):
                return True
 
            # as the array is sorted
            if (A[i] + A[j] > X):
                break
             
    # No pair found with given sum
    return 0
 
# Driver code
arr = [3, 5, 9, 2, 8, 10, 11]
val = 17
 
print(isPairSum(arr, len(arr), val))
 
# This code is contributed by maheshwaripiyush9
Producción

1

Complejidad temporal:  O(n 2 )

Espacio Auxiliar: O(1)

Ahora veamos cómo funciona la técnica de dos puntos. Tomamos dos punteros, uno que representa el primer elemento y otro que representa el último elemento de la array, y luego sumamos los valores guardados en ambos punteros. Si su suma es menor que X, desplazamos el puntero izquierdo hacia la derecha o si su suma es mayor que X, desplazamos el puntero derecho hacia la izquierda para acercarnos a la suma. Seguimos moviendo los punteros hasta obtener la suma como X. 

Python3

# Two pointer technique based solution to find
# if there is a pair in A[0..N-1] with a given sum.
def isPairSum(A, N, X):
 
    # represents first pointer
    i = 0
 
    # represents second pointer
    j = N - 1
 
    while(i < j):
       
        # If we find a pair
        if (A[i] + A[j] == X):
            return True
 
        # If sum of elements at current
        # pointers is less, we move towards
        # higher values by doing i += 1
        elif(A[i] + A[j] < X):
            i += 1
 
        # If sum of elements at current
        # pointers is more, we move towards
        # lower values by doing j -= 1
        else:
            j -= 1
    return 0
 
# array declaration
arr = [3, 5, 9, 2, 8, 10, 11]
 
# value to search
val = 17
 
print(isPairSum(arr, len(arr), val))
 
# This code is contributed by maheshwaripiyush9.
Producción

1

Ilustración : 
 

Complejidad de tiempo:  O(n)

Espacio Auxiliar: O(1) ya que usa espacio constante

¿Como funciona esto?  
Básicamente, el algoritmo utiliza el hecho de que la array de entrada está ordenada. Comenzamos la suma de los valores extremos (el más pequeño y el más grande) y movemos condicionalmente ambos punteros. Movemos el puntero izquierdo i cuando la suma de A[i] y A[j] es menor que X. No perdemos ningún par porque la suma ya es menor que X. La misma lógica se aplica para el puntero derecho j.

Más problemas basados ​​en la técnica de dos punteros. 

¡ Consulte el artículo completo sobre la técnica de dos punteros para obtener más detalles!

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *