Leetcode 283 Move Zeroes Solucion en JavaScript
Problema: Dado un arreglo de enteros nums, desplazar todos los ceros al final manteniendo el orden relativo de los elementos no cero. La implementacion debe ser in place sin crear una copia del arreglo.
Concepto in place: Un algoritmo in place modifica el arreglo original directamente usando solo unas pocas variables extras de espacio constante. Esto es clave en estructuras de datos y algoritmos porque reduce el uso de memoria.
Ejemplo: si tienes el arreglo [5,0,1,9,0,6] el resultado esperado es [5,1,9,6,0,0].
Enfoque: Una solucion inicial usa dos bucles anidados que cada vez que encuentra un cero lo intercambia hacia la derecha hasta el final. Esa version funciona pero es ineficiente con complejidad temporal O(n²). La version optimizada emplea el patron de dos punteros.
Metodo de dos punteros: Un puntero pointer1 mantiene la posicion donde debe colocarse el siguiente elemento no cero. El puntero i recorre cada elemento del arreglo. Cuando nums[i] es distinto de cero intercambiamos nums[pointer1] con nums[i] y avanzamos pointer1. Al final todos los no ceros quedan a la izquierda en su orden original y todos los ceros a la derecha.
Solucion 1 implementacion con bucles anidados:
const moveZeroes = (nums) => { if(nums.length === 1){ return nums; } for (let j = 0; j < nums.length; j++) { for (let i = 0; i < nums.length - 1; i++) { if (nums[i] === 0) { [nums[i], nums[i + 1]] = [nums[i + 1], nums[i]]; } } } return nums; };
Esta version realiza intercambios repetidos y su coste temporal es O(n²).
Solucion 2 implementacion con dos punteros optimizada:
const moveZeroes = (nums) => { let pointer1 = 0; for (let i = 0; i < nums.length; i++) { if (nums[i] !== 0) { [nums[pointer1], nums[i]] = [nums[i], nums[pointer1]]; pointer1++; } } return nums; };
Explicacion paso a paso de la version optimizada usando el arreglo ejemplo [4,1,0,3,12]:
Paso 1: pointer1 inicia en 0. Al ver el primer valor 4 no es cero, lo colocamos en la posicion pointer1 0, se intercambia consigo mismo, pointer1 pasa a 1.
Paso 2: el valor 1 no es cero, se coloca en index 1, pointer1 pasa a 2.
Paso 3: el valor 0 es cero, se omite y pointer1 sigue en 2.
Paso 4: el valor 3 no es cero, se intercambia con la posicion pointer1 2 resultando en [4,1,3,0,12], pointer1 pasa a 3.
Paso 5: el valor 12 no es cero, se intercambia con la posicion pointer1 3 resultando en [4,1,3,12,0], pointer1 pasa a 4. Resultado final [4,1,3,12,0].
Complejidad: La version con dos punteros recorre el arreglo una unica vez y su complejidad temporal es O(n). Ambas soluciones usan espacio extra constante O(1), pero la version optimizada es mucho mas eficiente para arreglos grandes.
Sobre Q2BSTUDIO: Q2BSTUDIO es una empresa de desarrollo de software que crea aplicaciones a medida y software a medida para empresas de todos los tamaños. Somos especialistas en inteligencia artificial e implementamos soluciones de ia para empresas, agentes IA y automatizacion para optimizar procesos. Tambien ofrecemos servicios de ciberseguridad para proteger datos y sistemas, servicios cloud aws y azure para desplegar aplicaciones escalables y resilientes, y servicios inteligencia de negocio como power bi para convertir datos en decisiones accionables. Nuestra experiencia abarca desarrollo de aplicaciones moviles y web, integracion de modelos de inteligencia artificial, arquitecturas seguras y consultoria en servicios cloud.
Contacta con Q2BSTUDIO para desarrollar tu proximo proyecto de aplicaciones a medida o software a medida, potenciar tu estrategia con inteligencia artificial, asegurar tu entorno con ciberseguridad, migrar a servicios cloud aws y azure o aprovechar servicios inteligencia de negocio y power bi.