La técnica dada por Rahul Chhabra tiene una complejidad de O (nlogn) y funcionaría bien, pero no hace uso del hecho de que la matriz de entrada está ordenada. Como ese es el caso, existe un algoritmo de tiempo lineal simple que se puede utilizar para encontrar el par con la suma dada.
Deje que la matriz de entrada sea A [] y que el número predefinido sea suma . Inicializamos dos punteros, digamos izquierda y derecha a los elementos de matriz más a la izquierda y a la derecha, respectivamente. Hacemos un bucle mientras se deja <derecha y hacemos lo siguiente:
- Si A [izquierda] + A [derecha] == suma, entonces devuelve verdadero.
- Si A [izquierda] + A [derecha]> suma, entonces disminuya el puntero derecho por un elemento.
- De lo contrario, incremente el puntero izquierdo en un elemento.
Si no se encuentra ningún par de elementos para satisfacer la condición en (1) al final del ciclo, entonces devuelve falso.
- Acabo de completar el primer año de ingeniería informática. Quería mejorar mi pensamiento lógico y algorítmico resolviendo problemas de un juez en línea. ¿Dónde empiezo?
- ¿Cuál es la diferencia entre array estático y automático?
- Cómo usar lower_bound para buscar una cadena en una estructura vectorial
- Cómo encontrar el elemento mínimo en un subárbol de un montón máximo
- Dada una biblioteca que proporciona una coincidencia aproximada de cadenas, ¿cuáles son algunos procedimientos adicionales que pueden explicar una mejor coincidencia de cadenas?
Código C ++ para la función que implementa el algoritmo anterior:
bool isPairPresent (vector A, int sum) {
int left = 0;
int right = (A.size () – 1);
while (izquierda <derecha) {
if (A [izquierda] + A [derecha] == suma)
volver verdadero;
más si (A [izquierda] + A [derecha]> suma)
derecha – = 1;
más
izquierda + = 1;
}
falso retorno;
}
El código anterior se puede modificar fácilmente para incluir:
- Devolver el par de enteros que suma al número deseado.
- Devolver múltiples pares de elementos (si la pregunta tiene múltiples soluciones) que suman el número deseado.