Optimización de Algoritmo para Encontrar Máxima Secuencia de Unos Binarios

Descripción del Reto Técnico

El problema planteado consiste en procesar un arreglo de entrada conteniendo exclusivamente dígitos binarios (0 y 1). El objetivo principal es identificar y cuantificar la extensión de la subsecuencia consecutiva de valores positivos (1) más larga presente en el conjunto de datos.

Case de Uso:

  • Arreglo de Entrada: [1, 1, 0, 1, 1, 1]
  • Resultado Esperado: 3

Válido bajo las siguientes condiciones: El vector incluye solamente caracteres numéricos 0 o 1. Su dimensión es un número entero positivo cuyo límite superior es 10,000.

Enfoques Mediante Manipulación de Cadenas

Una solución inicial viable implica convertir la estructura de datos lineal en una representación textual. Al concatenar los elementos, se habilita el uso de métodos de expresión regular para segmenatr el contenido según patrones específicos.

A través de la unión de todos los elementos, podemos buscar grupos de uno o más dígitos '1'. Una vez obtenidas las coincidencias, se calcula el tamaño de cada fargmento encontrado para identificar el predominante.


const analizarPorExpresionRegular = (vectorBinario) => {
    if (vectorBinario.length === 0) return 0;
    
    // Convertir el arreglo numérico a una cadena continua
    const representacionTexto = vectorBinario.join('');
    
    // Extraer todas las secuencias posibles de '1'
    const gruposEncontrados = representacionTexto.match(/1+/g);
    
    // Validar existencia de secuencias válidas
    if (!gruposEncontrados) return 0;
    
    // Obtener la longitud máxima directamente sin ordenamiento completo
    return Math.max(...gruposEncontrados.map(grupo => grupo.length));
};

Esta técnica, aunque fácil de implementar, genera sobrecarga en memoria al instanciar nuevos objetos de cadena. Además, depende de la eficiencia interna del motor de regex.

Solución Óptima de Complejidad Lineal

Para alcanzar el mejor rendimiento posible, se recomienda iterar sobre el arreglo original sin generar copias intermedias. Este método opera con complejidad de tiempo O(n) y espacio O(1).

La lógica requiere mantener dos indicadores durante el desplazamiento: un contador progresivo para la racha actual de unos, y una variable maestra que conserva el valor máximo alcanzado hasta el punto de ejecución.


const calcularMejorSecuencia = (datos) => {
    let contadorCorriente = 0;
    let maximoGlobal = 0;

    datos.forEach((valor) => {
        if (valor === 1) {
            contadorCorriente++;
        } else {
            // Actualizar el récord global antes de reiniciar
            maximoGlobal = Math.max(maximoGlobal, contadorCorriente);
            contadorCorriente = 0;
        }
    });

    // Garantizar que la última secuencia sea considerada
    return Math.max(maximoGlobal, contadorCorriente);
};

Este algoritmo examina cada posición una sola vez. Ante la aparición de un cero, se compara el acumulado local contra el récord establecido y se procede a limpiar el contador. Finalmente, tras completar el ciclo, se realiza una comparación final para asegurar que una secuencia terminal larga no sea descartada inadvertidamente.

Etiquetas: JavaScript leetcode Arrays algorithm-optimization

Publicado el 9-3 02:54