Dadas dos arrays de números a 1 , a 2 , a 3 ,…a n y b 1 , b 2 , .. b n donde cada número es 0 o 1, el algoritmo más rápido para encontrar el lapso más grande (i, j) tal que un yo + un yo+1 , ….un j = segundo yo + segundo yo+1 , .. segundo j . o informar que no existe tal lapso,
(A) Toma el tiempo O(n 3 ) y Ω(2 n ) si se permite el hashing
(B) Toma el tiempo O(n 3 ) y Ω(n 2.5 ) en el modelo de comparación clave
(C) Toma θ(n) tiempo y espacio
(D) Toma O(√n) tiempo solo si la suma de los 2n elementos es un número par
Respuesta: (C)
Explicación: El problema se puede resolver en Toma θ(n ) tiempo y espacio.
La idea se basa en las siguientes observaciones.
- Dado que hay un total de n elementos, la suma máxima es n para ambas arrays.
- La diferencia entre dos sumas varía de -n a n . Entonces hay un total de 2n + 1 valores posibles de diferencia.
- Si las diferencias entre las sumas de prefijos de dos arrays se vuelven iguales en dos puntos, entonces las subarreglas entre estos dos puntos tienen la misma suma.
A continuación se muestra el algoritmo completo.
- Cree una array auxiliar de tamaño 2n+1 para almacenar los puntos de inicio de todos los valores posibles de las diferencias (tenga en cuenta que los valores posibles de las diferencias varían de -n a n, es decir, hay un total de 2n+1 valores posibles)
- Inicialice los puntos de inicio de todas las diferencias como -1.
- Inicialice maxLen como 0 y prefije las sumas de ambas arrays como 0, preSum1 = 0, preSum2 = 0
- Atraviese ambas arrays desde i = 0 hasta n-1.
- Actualizar sumas de prefijos: preSum1 += arr1[i], preSum2 += arr2[i]
- Calcule la diferencia de las sumas de prefijos actuales: curr_diff = preSum1 – preSum2
- Encuentre el índice en la array diff: diffIndex = n + curr_diff // curr_diff puede ser negativo y puede ir hasta -n
- Si curr_diff es 0, entonces i+1 es maxLen hasta ahora
- De lo contrario, si curr_diff se ve por primera vez, es decir, el punto de inicio de la diferencia actual es -1, entonces actualice el punto de inicio como i
- De lo contrario ( curr_diff NO se ve por primera vez), luego considere i como punto final y encuentre la longitud del mismo intervalo de suma actual. Si esta longitud es mayor, actualice maxLen
- Devolver maxLen
Consulte el intervalo más largo con la misma suma en dos arrays binarias para ver el código de ejecución completo
Cuestionario de esta pregunta
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