son reglas por números numeros numero los ejemplos divisibles divisible divisibilidad cuáles cuando criterios algorithm math recursion time-complexity

algorithm - reglas - Encuentra la longitud de secuencia más larga cuya suma es divisible por 3



numeros divisibles por 3 (4)

Como una persona que no es CS, esto es interesante. El primer enfoque mío fue simplemente calcular la suma corriente mod 3. Obtendrás una secuencia de {0,1,2}. Ahora busque el primer y el último 0, el primero y el último 1 y el primero y el último 2, y compare sus respectivas distancias ...

Tengo un ejercicio que debe hacerse con O (n) complejidad de tiempo, sin embargo, solo puedo resolverlo con una solución O (n ^ 2)

Tiene una matriz y necesita contar la secuencia contigua más larga para que su suma se pueda dividir en 3 sin ningún resto. Por ejemplo, para la array {1,2,3,-4,-1) , la función devolverá 4 porque la secuencia más larga en que su sum(0) se puede dividir en 3 es {2,3,-4,-1} .

Mi solución O (n ^ 2) se basa en la arithmetic progression . ¿Hay alguna manera de hacerlo con O (n) complejidad?

Por favor, solo quiero una pista o una explicación teórica. Por favor, no escribas la solución completa :)


Echemos un vistazo a las sumas de prefijo. Un subarreglo [L, R] se divide por 3 si y solo si
prefixSum[L - 1] mod 3 = prefixSum[R] mod 3 . Esta observación proporciona una solución lineal muy simple (debido a que solo hay 3 valores posibles de un prefijo suma mod 3, simplemente podemos encontrar el primero y el último).

Por ejemplo, si la matriz de entrada es {1, 2, 3, -4, -1}, las sumas de prefijo son {0, 1, 0, 0, 2, 1}. (hay n + 1 sumas de prefijo debido a un prefijo vacío). Ahora solo puede echar un vistazo a la primera y última aparición de 0, 1 y 2.


Iterar a través de la matriz, sumando el total a medida que avanza. Registre la posición de la primera posición donde la suma del módulo es 0 . Además, registre la posición de la primera posición donde la suma del módulo es 1 . Y, finalmente, registre la posición de la primera posición donde la suma del módulo es 2 .

Haga lo mismo hacia atrás también, registrando la última posición donde la suma del módulo es 0 , 1 y 2 . Eso le da tres posibilidades para la secuencia más larga: simplemente marque qué par está más alejado.


Se aplica la programación dinámica. Por cada posición calculas 3 valores:

  • La secuencia más larga que termina en esa posición que tiene suma s = 0 mod 3
  • La secuencia más larga que termina en esa posición que tiene suma s = 1 mod 3
  • La secuencia más larga que termina en esa posición que tiene suma s = 2 mod 3

Por lo tanto, dado este valor para la posición i, puede calcular fácilmente los nuevos para la posición i + 1.