22 de jul de 2026

El truco de la pila para maximizar un número

Tenés una secuencia de dígitos y querés quedarte con exactamente k, respetando el orden original, de forma que el número resultante sea el más grande posible. La intuición de “agarrá los k dígitos más grandes” falla: en 291 con k = 2, los más grandes son 9 y 2, pero el máximo real es 91.

La clave es que un dígito grande vale más cuanto más a la izquierda esté. Entonces recorrés de izquierda a derecha con una pila, y cada vez que el dígito actual es mayor que el tope, sacás el tope — siempre que te queden descartes disponibles.

function maxKeeping(s, k) {
  let removals = s.length - k;
  const stack = [];
  for (const ch of s) {
    while (removals > 0 && stack.length && stack.at(-1) < ch) {
      stack.pop();
      removals--;
    }
    stack.push(ch);
  }
  return stack.slice(0, k).join('');
}

Corre en O(n) y es exacto, no una heurística.

← Todas las notas