Ir al contenido
Formación en Algoritmos y Programación | Deep Skill
  • Inicio
  • Cursos
  • Mi Aprendizaje
  • Blog
  • 0
  • Iniciar sesión
  • Contáctenos
Formación en Algoritmos y Programación | Deep Skill
  • 0
    • Inicio
    • Cursos
    • Mi Aprendizaje
    • Blog
  • Iniciar sesión
  • Contáctenos
  • Todos los blogs
  • Problemas de Entrevista Técnica (Big Tech)
  • Problema Real de Entrevista (Meta): Recorrido de matrices con patrón cambiante (Diagonal Traverse)
  • Problema Real de Entrevista (Meta): Recorrido de matrices con patrón cambiante (Diagonal Traverse)

    6 de enero de 2026 por
    Problema Real de Entrevista (Meta):
Recorrido de matrices con patrón cambiante (Diagonal Traverse)
    Deep Skill, Jean Pierre Mandujano
    | Todavía no hay comentarios
    Diagonal Traverse — Deep Skill

    Diagonal Traverse

    Descripción del Problema

    El problema, conocido como Diagonal Traverse (Recorrido Diagonal), nos presenta una matriz de tamaño M x N (M filas y N columnas). El objetivo es devolver un arreglo que contenga todos los elementos de la matriz, pero recorridos en un orden diagonal específico de "zig-zag".

    Ejemplo:

    Dada la siguiente matriz de 3 x 3:

    123
    456
    789

    Las diagonales se recorren en este orden:

    1. Primera diagonal (hacia arriba): [1]
    2. Segunda diagonal (hacia abajo): [2, 4]
    3. Tercera diagonal (hacia arriba): [7, 5, 3]
    4. Cuarta diagonal (hacia abajo): [6, 8]
    5. Quinta diagonal (hacia arriba): [9]

    Salida esperada: [1, 2, 4, 7, 5, 3, 6, 8, 9]

    La Observación Clave (El "Insight")

    Para simplificar el problema, se propone no intentar simular el movimiento de zig-zag directamente (lo cual implica manejar muchos índices y límites), sino buscar una propiedad matemática común.

    La observación fundamental es: Todos los elementos que pertenecen a la misma diagonal comparten la misma suma de sus índices.

    Si un elemento está en la posición (fila, columna), entonces:

    • El elemento (0 + 0 = 0) pertenece a la diagonal 0
    • Los elementos (0,1) y (1,0) tienen suma de índices 1
    • Los elementos (0,2), (1,1), (2,0) tienen suma 2

    Conclusión: Podemos agrupar los elementos en listas basadas en la suma de sus índices i + j.

    La Estrategia de Solución

    Una vez que agrupamos los elementos por su número de diagonal (i + j), notamos un patrón:

    Al recorrer la matriz fila por fila, los elementos de una misma diagonal quedan guardados de arriba hacia abajo.

    Pero el problema pide orden “zig-zag”:

    • Diagonales pares (0, 2, 4…) deben ir hacia arriba
    • Diagonales impares (1, 3, 5…) deben ir hacia abajo

    Idea: invertir solo las diagonales pares.

    Solución Paso a Paso (Código)

    Paso 1: Inicialización

    Definimos el número de filas (m) y columnas (n). Calculamos el total de diagonales como (M + N - 1). Creamos un vector de vectores:

    
    int m = mat.size();
    int n = mat[0].size();
    
    // Creamos un vector de vectores para las diagonales
    vector<vector<int>> diagonals(m + n - 1);
    

    Paso 2: Agrupación (Bucketing)

    Recorremos la matriz. Para cada elemento mat[i][j] calculamos la diagonal como i + j:

    
    for (int row_index = 0; row_index < m; row_index++) {
        for (int col_index = 0; col_index < n; col_index++) {
            int diagonal_number = row_index + col_index;
            diagonals[diagonal_number].push_back(mat[row_index][col_index]);
        }
    }
    

    Nota: quedan ordenadas de arriba hacia abajo.

    Paso 3: Construcción de la Respuesta e Inversión

    Creamos el vector final ans. Iteramos sobre cada diagonal:

    • Si el número de diagonal es par, invertimos con rbegin() y rend().
    • Si es impar, usamos begin() y end().
    
    vector<int> ans;
    for (int diagonal_number = 0; diagonal_number < diagonals.size(); diagonal_number++) {
        if (diagonal_number % 2 == 0) {
            // Diagonal PAR: Invertir orden
            ans.insert(ans.end(), diagonals[diagonal_number].rbegin(), diagonals[diagonal_number].rend());
        } else {
            // Diagonal IMPAR: Mantener orden
            ans.insert(ans.end(), diagonals[diagonal_number].begin(), diagonals[diagonal_number].end());
        }
    }
    return ans;
    

    Análisis de Complejidad

    • Complejidad de Tiempo: O(M × N). Recorremos cada celda una vez y luego construimos el vector final.
    • Complejidad de Espacio: O(M × N). Guardamos temporalmente todos los valores agrupados por diagonal.
    BENEFICIO EXCLUSIVO

    Obtén un 50% de descuento en tu primera compra de cursos de algoritmos

    SKILL-ALGO-50


    en Problemas de Entrevista Técnica (Big Tech)
    Iniciar sesión dejar un comentario

    Síganos

    Escríbenos
    [email protected]

    Escríbenos
    [email protected]

    Síganos