Dada una matriz de enteros, encuentre una subarray que tenga una suma dada en él.

Por ejemplo,

Input:  nums[] = {2, 6, 0, 9, 7, 3, 1, 4, 1, 10}, target = 15
Output: {6, 0, 9}
 
 
Input:  nums[] = {0, 5, -7, 1, -4, 7, 6, 1, 4, 1, 10}, target = 15
Output: {1, -4, 7, 6, 1, 4} or {4, 1, 10}
 
 
Input:  nums[] = {0, 5, -7, 1, -4, 7, 6, 1, 4, 1, 10}, target = -3
Output: {1, -4} or {-7, 1, -4, 7}

Practice this problem

1. Uso de la ventana deslizante

Podemos resolver este problema usando un ventana deslizante. La idea es mantener una ventana que comience desde el elemento actual, y la suma de sus elementos sea mayor o igual a la suma dada. Si la suma de la ventana actual se vuelve menor que la suma dada, entonces la ventana es inestable y seguimos agregando elementos a la ventana actual desde su derecha hasta que la ventana vuelve a ser estable. Imprime la ventana si su suma es igual a la suma dada en cualquier punto. Tenga en cuenta que este enfoque solo funcionará con una array de enteros positivos.

El algoritmo se puede implementar de la siguiente manera en C++, Java y Python:

C++


Descargar  Ejecutar código

Resultado:

Subarray found [1–3]

Java


Descargar  Ejecutar código

Resultado:

Subarray found [1–3]

Python


Descargar  Ejecutar código

Resultado:

Sublist found (1, 3)

La complejidad temporal de la solución anterior es O(n) y no requiere ningún espacio adicional, donde n es el tamaño de la entrada.

2. Uso de hashing

La solución anterior fallará para números negativos. Nosotros podemos usar hash para verificar si un subarray con la suma dada existe en el arreglo o no. La idea es atravesar la matriz dada y mantener la suma de los elementos vistos hasta ahora. Si la diferencia entre la suma actual y la suma dada se ve antes (es decir, la diferencia existe en el conjunto), devuelve verdadero ya que hay al menos un subarray con la suma dada que termina en el índice actual; de lo contrario, inserte la suma en el conjunto.

A continuación se muestra la implementación del algoritmo anterior en C++, Java y Python:

C++


Descargar  Ejecutar código

Resultado:

Subarray with the given sum exists

Java


Descargar  Ejecutar código

Resultado:

Subarray with the given sum exists

Python


Descargar  Ejecutar código

Resultado:

Sublist with the given sum exists

También podemos imprimir el subarray usando hashing. La idea es usar un mapa en lugar de un conjunto que almacene el índice final del subarray y su suma.

C++


Descargar  Ejecutar código

Resultado:

Subarray found [3–8]

Java


Descargar  Ejecutar código

Resultado:

Subarray found [3–8]

Python


Descargar  Ejecutar código

Resultado:

Sublist found (3, 8)

La complejidad temporal de la solución anterior es O(n) y requiere O(n) espacio adicional, donde n es el tamaño de la entrada.