Cómo averiguar si existen dos elementos en una matriz ordenada cuya suma es igual a algún número predefinido

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:

  1. Si A [izquierda] + A [derecha] == suma, entonces devuelve verdadero.
  2. Si A [izquierda] + A [derecha]> suma, entonces disminuya el puntero derecho por un elemento.
  3. 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.

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:

  1. Devolver el par de enteros que suma al número deseado.
  2. Devolver múltiples pares de elementos (si la pregunta tiene múltiples soluciones) que suman el número deseado.

Uno podría ser:
tomar cada elemento a partir del primero y
usando una búsqueda binaria para encontrar un elemento que pueda sumarse con él.
Buscar solo elementos después del elemento elegido.
continuar el elemento elegido cruza la mitad de la suma requerida.
Compruebe también si el número más grande de la matriz es mayor que la mitad de la suma y el número más pequeño de la matriz es menor que la mitad de la suma requerida.

Comentario para más aclaraciones.

More Interesting

¿Cuáles son los famosos algoritmos de Java para principiantes?

¿Qué debe saber todo programador sobre tablas hash y funciones hash?

¿Cómo funciona el algoritmo de fijación de precios de Megabus?

Cómo resolver el problema de cambio de UVa 166 si tenemos una oferta limitada de cada denominación

¿Por qué los finalistas de Topcoder no comparten su experiencia en los tutoriales de YouTube para principiantes? Cualquier principiante agradecería la ayuda para desarrollar sus habilidades para resolver problemas.

¿Cuál es la mejor manera de aprender algoritmos de informática?

Cómo imprimir rutas en forma DFS en gráficos

¿Cuáles son los algoritmos que se pueden usar en R para la predicción de datos categóricos?

Cómo encontrar la cantidad mínima de pasos necesarios para eliminar todos los peones del tablero de ajedrez

Hay dos imágenes ¿Hay algún algoritmo que pueda decirnos si una imagen se recorta de la otra?

¿Cuáles son las mejores preguntas de la entrevista de estructura de datos de árbol?

¿Por qué se garantiza que la liebre y la tortuga se encontrarán en el algoritmo de detección de ciclos de Floyd?

¿Qué es el algoritmo de Wagner y Fischer y cuál es su código de muestra en C ++?

¿Qué enunciado describe mejor por qué la notación Big-O es una forma muy útil de analizar la complejidad del algoritmo?

¿Existe un método o algoritmo matemático para expresar la suma de un número y un número multiplicado por un radical como la fórmula (a + b) ^ 3?