Por Alan Martinez
Un apuntador también conocido como punteros, son la representación de una dirección, estos son sirven para ahorrar memoria, crear vectores y matrices con memoria dinamica y como paso de parametros. Este se declara con el operador *, y se le asignan direcciones de memoria con el operador &.
*
&
El método de dos punteros utiliza dos punteros para iterar a través de los valores de un arreglo. Ambos punteros se mueven en una sola dirección, lo que garantiza la eficiencia del algoritmo.
Su objetivo principal es optimizar la solución de problemas en los que se requiere explorar relaciones entre elementos de un arreglo o secuencia, reduciendo el tiempo de ejecución que normalmente sería más costoso en una solución ingenua. Este enfoque se utiliza para resolver problemas de búsqueda, suma, o comparación que suelen involucrar pares de elementos o subarreglos.
Búsqueda de pares con ciertas propiedades:
Manipulación de subarreglos o subsecuencias:
Problemas de fusión o comparación de listas ordenadas:
Dado un arreglo de enteros positivos y un objetivo x, queremos encontrar un subarreglo cuya suma sea exactamente x.
[1, 3, 2, 5, 1, 1, 2, 3]
x = 8
int main() { vector<int> arr = {1, 3, 2, 5, 1, 1, 2, 3}; int x = 8; if (subarraySum(arr, n, x)) { cout << "Subarreglo encontrado.\n"; } else { cout << "No se encontró subarreglo.\n"; } return 0; }
bool subarraySum(vector<int>& arr, int n, int x) { int left = 0, right = 0; int current_sum = 0; while (right < arr.size()) { current_sum += arr[right]; // sumamos el valor de arr[right] while (current_sum > x && left <= right) { current_sum -= arr[left]; // reducimos el valor de arr[left] left++; // movemos el puntero izquierdo } if (current_sum == x) { return true; // Se encontró el subarreglo con suma x } right++; // movemos el puntero derecho } return false; // No se encontró subarreglo }
left
right
x
Vamos a hacer una prueba de escritorio paso a paso usando el código en C++ que implementa el método de dos punteros para encontrar un subarreglo cuya suma sea igual a x = 8. Seguiremos el código y explicaremos cómo funcionan los punteros left y right junto con la variable current_sum.
current_sum
Posición inicial:
left = 0
1
right = 0
current_sum = 0
Acción: Sumamos *right al current_sum.
*right
current_sum = 1
Evaluación: current_sum < x, así que movemos el puntero right una posición a la derecha.
current_sum < x
Posición:
right = 1
3
current_sum = 1 + 3 = 4
right = 2
2
current_sum = 4
current_sum = 4 + 2 = 6
right = 3
5
current_sum = 6
current_sum = 6 + 5 = 11
Evaluación: current_sum > x, así que movemos el puntero left una posición a la derecha para reducir la suma.
current_sum > x
left = 1
current_sum = 11
Acción: Restamos *left del current_sum y movemos left.
*left
current_sum = 11 - 1 = 10
Evaluación: current_sum > x, así que movemos el puntero left una posición más a la derecha.
left = 2
current_sum = 10
current_sum = 10 - 3 = 7
right = 4
current_sum = 7
current_sum = 7 + 1 = 8
Evaluación: current_sum == x. ¡Subarreglo encontrado!
current_sum == x
El subarreglo encontrado es [2, 5, 1], que suma exactamente 8.
[2, 5, 1]
8
1 + 3 + 2 = 6
1 + 3 + 2 + 5 = 11
3 + 2 + 5 = 10
2 + 5 + 1 = 8