Dada una matriz ordenada, ¿cómo encontrarías dos números cuya suma es igual a un número dado en O (n)?

A2A

Idealmente, debería pensar en una solución antes de hacer esta pregunta, suponiendo que lo hiciera, estoy escribiendo a continuación.

Claro, olvidé la mayor parte de lo que aprendí en algoritmos por ahora, pero dado que solo solicitó el algoritmo, que es la forma correcta, probaré el sin procesar sin ver el enlace, ya que parece ser nuevo para mí.

A es una matriz. Digamos que N es el número de elementos.

x es un número que es la suma de unos 2 números en la matriz.

si deduzco x de A [N-1] (último ele), llámelo como diff, y luego encuentre si el diff está en A [0, N-2], entonces debería decir si ese par (A [N- 1], diff) existe.

Si no se encuentra, continúe con A [N-2] (último segundo elemento), hasta que la matriz tenga un solo elemento.

Como está buscando en toda la matriz (N) y si encuentra la diferencia con la búsqueda binaria (log N), estamos viendo N logN

Para volver a intentar una lógica un poco mejor,

Consideraría elegir A [N-1], A [N-2] de manera no secuencial, es decir, en lugar de, de último a primero, también podría realizar una búsqueda binaria allí, es decir, elegiría el elemento medio del conjunto, luego el centro del conjunto del lado izquierdo, o el conjunto del lado derecho. Aquí supongo que la diferencia ayudará cuando es -ve o + ve para ir a qué lado de la matriz del elemento medio.

Una vez que sea posible desde N * log N anterior, mejoraría para registrar N * log N, que debería ser más rápido.

Obviamente veo que puede haber una mejor solución usando más memoria aquí.

En general, cuando pienso en una solución que es menor que N log N, como log N * log N ahora, solo entonces codifico para ahorrar tiempo.

Esperar más rápido que uno rápido ayuda en una solución óptima para usted.

Podemos usar Hashing para resolver fácilmente este problema en tiempo lineal. La idea es insertar cada elemento de la matriz arr [i] en un mapa. También verificamos si la diferencia (arr [i], sum-arr [i]) ya existe en el mapa o no. Si la diferencia se ve antes, imprimimos el par y regresamos.

Consulte el último enfoque discutido aquí para la implementación.

Primero expongamos el problema. Se nos da una matriz [math] A [1] \ leq \ ldots \ leq A [n] [/ math] y un número x y necesitamos verificar la existencia de un par de índices [math] i [/ math] y [matemática] j [/ matemática] tal que [matemática] 1 \ leq i

El artículo explica la solución [matemática] O (n) [/ matemática] que funciona utilizando hashing. No supone que la matriz de entrada esté ordenada. Utiliza un espacio adicional [matemático] O (n) [/ matemático] y tiene un tiempo lineal, ya que se supone que la búsqueda y la adición en conjuntos hash toman tiempo constante.

Consideremos otra solución que también requiere tiempo lineal pero no utiliza ningún espacio adicional. Si [math] n = 2 [/ math] entonces nuestro problema es trivial y es suficiente para verificar si [math] A [1] + A [2] = x [/ math] o no. Este será nuestro caso base.

Suponga que [matemática] n> 2, [/ matemática] luego compare [matemática] A [1] + A [n] [/ matemática] con [matemática] x [/ matemática]. Si [matemática] A [1] + A [n] = x [/ matemática], entonces tenemos una solución donde [matemática] i = 1 [/ matemática] y [matemática] j = n [/ matemática].

Notamos que si [matemática] A [1] + A [n]> x [/ matemática] entonces [matemática] A [n] [/ matemática] no puede ser parte de ninguna solución y [matemática] j \ neq n [/ math] como para todos [math] 1 \ leq i \ leq n, A [i] + A [n]> x. [/ math] Para que podamos eliminar [math] A [n] [/ math] de Considerar y considerar un problema menor de tamaño [matemática] n – 1 [/ matemática] descrita como [matemática] A [1] \ leq \ ldots \ leq A [n-1] [/ matemática] y [matemática] x [/ matemáticas].

Por otro lado, si [matemática] A [1] + A [n]

Esto se conoce comúnmente en la programación competitiva como el enfoque de dos punteros.

Otro enfoque que puede funcionar y no necesita espacio auxiliar es la búsqueda binaria, pero su peor complejidad temporal es [matemática] O (n \ log n) [/ matemática]. Sin embargo, debe tener cuidado si se permiten duplicados ya que la implementación descuidada de la búsqueda binaria podría no distinguir el caso donde [matemática] A [i] + A [i] = x [/ matemática] es la única solución. Por ejemplo, [matemática] A = [2, 3, 5] [/ matemática] y [matemática] x = 6, [/ matemática] una solución incorrecta en ese caso consideraría que un par de elementos de [matemática] A [ / math] cuya suma es [math] x [/ math] existe.

La solución de Quora User funciona de manera más efectiva. Acabo de poner mi implementación en Ruby aquí:

def target_pair (arr, objetivo)
temp = {}
resultado = {}
arr.each do | x |
temp [x]? resultado [x] = objetivo – x: temp [objetivo – x] = verdadero
fin
resultado
fin

objetivo = 23
arr = 50.times.map {| x | rand (50)}

pone “# {arr.inspect} \ n \ n”
pone target_pair (arr, target) .to_s.gsub (‘=>’, ‘+’)

Imprimirá algo similar a esto:

[45, 43, 18, 25, 15, 46, 11, 7, 5, 3, 4, 23, 29, 37, 49, 0, 20, 34, 11, 13, 8, 4, 25, 17, 10 , 25, 32, 31, 30, 38, 38, 9, 14, 9, 11, 22, 42, 18, 45, 39, 16, 27, 23, 16, 46, 7, 26, 43, 33, 5 ]

{5 + 18, 0 + 23, 20 + 3, 8 + 15, 10 + 13, 14 + 9, 16 + 7}

Esta implementación de búsqueda binaria lo haría. ctci / main.go en master · amay0048 / ctci · GitHub

Eche un vistazo aquí para ver la declaración del problema que acompaña a la solución anterior.

La esencia:

  1. Eliminar el primer elemento de la matriz
  2. Objetivo = la diferencia entre el primer elemento y la suma que busca
  3. Binario busca el resto de la matriz para el objetivo
  4. Repita 1–3 hasta que encuentre la suma que está buscando o se quede sin elementos de la matriz

Actualizar

Según la descripción de Hassan AbouEisha, esto es realmente O n log n

También encontré este gran chat en mis viajes, espero que ayude a alguien Hoja de trucos de la complejidad del algoritmo Big-O

En realidad, la matriz no necesita ser ordenada. Todavía puede hacer este trabajo en O (n) complejidad de tiempo con cualquier matriz. Aquí hay un fragmento de JS. Genera una matriz de 50 enteros positivos aleatorios entre 1–50 y luego intenta encontrar los pares cuya suma es igual al objetivo (23 en este caso) en una sola pasada. Pruébelo en las herramientas de desarrollo de su navegador.

función getTargetPair (a, t) {
var ht = {}, // hash temporal
hr = {}; // resultado hash
a.forEach (e => ht [e]? hr [e] = te
: ht [te] = verdadero);
volver h;
}

var tgt = 23, // suma objetivo
arr = Array (30) .fill (). map (_ => ~~ (Math.random () * 50 + 1)),
res = {}; // resultado del acebo
res = getTargetPair (arr, tgt);
console.log (arr);
console.log (res);

paso 1- almacena todos los elementos de la matriz en hashset en o (n)

paso 2- para cada elemento i en la matriz verifique si (xi) está en el hashset, terminando este ciclo en o (n). siga imprimiendo los pares donde el cheque devuelve verdadero.

Recuerdo una maqueta de una entrevista de Google con esta misma pregunta:

Cómo: trabajar en Google: codificación de ejemplo / entrevista de ingeniería

More Interesting

¿Cuáles son las preguntas formuladas por L&T durante las entrevistas en el campus?

¿Cuáles son las mejores y peores cosas de las entrevistas telefónicas técnicas?

¿Existe algún criterio porcentual (para el 10 ° y 12 ° y BE) para obtener un trabajo en Amazon India?

Cómo reorganizar elementos en una matriz bidimensional dada de enteros positivos para satisfacer cada suma de filas y columnas

Cómo mejorar mi proceso de pensamiento para las entrevistas de codificación

¿Cuáles son las cosas más influyentes que puedo hacer para aumentar mis posibilidades de éxito en la entrevista técnica de Hack Reactor?

¿Cuáles son las preguntas principales de la entrevista Java?

¿Qué empresas o startups debo solicitar para una pasantía?

¿Cómo imprimo una matriz de enteros con índices de caracteres en c o c ++?

¿Cuáles son algunas de las asombrosas preguntas de rompecabezas formuladas en una entrevista de empresa de TI?

¿Qué tipo de preguntas técnicas se hacen típicamente durante una entrevista para un desarrollador senior - posición PHP?

¿Cuál será un buen libro o revista para seguir para programar entrevistas requeridas en prácticas y entrevistas posteriores a la graduación de colegios / universidades?

¿Sería mi sitio web un buen proyecto para dejar en mi currículum?

¿Cuánto tiempo debería permitirme resolver un problema * difícil * de Leetcode?

¿Cómo podemos encontrar el número de subsecuencias consecutivas en una matriz, con la propiedad de que la suma de las subsecuencias es menor que un número k?