Проблема:

Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image.
Example:
Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output:  [1,2,4,7,5,3,6,8,9]
Explanation:
Note:
The total number of elements of the given matrix will not exceed 10,000.

Решение:

В моем подходе я пытаюсь пройти матрицу сверху вниз по диагонали и использую флаг «Обратный», чтобы переключать значения для получения зигзагообразного узора.

Позвольте мне объяснить, используя матрицу:

initial condition: i= 0; j=0, reverse = true;
so the pointers in matrix will be 
      j
      |
      v
i-> [ 1, 2, 3 ],
    [ 4, 5, 6 ],
    [ 7, 8, 9 ]
we loop until j >=0 and i < row and i > -1
so the value fetched will be [1]
since the reverse flag is true, we will reverse the values of the array [1] =>[1]. then we toggle the value of reverse flag.
now push this values in to return matrix.
next time we increase the j value by 1 so the values will be 
j =1, i =0, reverse = false.
so pointer will look like 
         j
         |
         v
i -> [ 1, 2, 3 ]
     [ 4, 5, 6 ]
     [ 7, 8, 9 ]
we push the value to the new array [2] and increment the i value and decrement the j value 
so pointer will look like
         j
         |
         v, 2, 3 ]
   i ->[ 4, 5, 6 ]
       [ 7, 8, 9 ]
we push the value to the new array [4] and increment the i value and decrement the j value
on decrementing it becomes -1 so we skip the loop. 
now the new array has the values [2,4]
since the reverse flag is false, we push the values to return matrix.
so return matrix will be [1,2,4]
now we increment the j = 2, i=0, reverse = true.
so pointer will look like
                j
                |
                V
   i -> [ 1, 2, 3 ]
        [ 4, 5, 6 ]
        [ 7, 8, 9 ]
we push the value to the new array [3] and increment the i value and decrement the j value
so pointer will look like
             j
             |
             V
        [ 1, 2, 3 ]
    i ->[ 4, 5, 6 ]
        [ 7, 8, 9 ]
we push the value to the new array [5] and increment the i value and decrement the j value
so pointer will look like
          j
          |
          V
        [ 1, 2, 3 ]
        [ 4, 5, 6 ]
    i ->[ 7, 8, 9 ]
we push the value to the new array [7] and increment the i value and decrement the j value
on decrementing it becomes -1 so we skip the loop.
now the new array has the values [3,5,7]
since the reverse flag is true, we push the values to return matrix in reverse order.
so return matrix will be [1,2,4,7,5,3]
Now the column value is reached the max value. so, from now onwards the j starting value will be the max value, it will be decremented till max row value and the i will start from 1st and it will be incremented to the max row value. 
so pointer will look like
                j
                |
                V
        [ 1, 2, 3 ]
    i ->[ 4, 5, 6 ]
        [ 7, 8, 9 ]
after j-- and i++, 
so pointer will look like
             j
             |
             V
        [ 1, 2, 3 ]
        [ 4, 5, 6 ]
    i ->[ 7, 8, 9 ]
on incrementing the i, it`s more than the max row count. so the loop stops. 
now the new array has the values [6,8]
since the reverse flag is false, we push the values to return matrix.
so return matrix will be [1,2,4,7,5,3,6,8]
now j= max value and i = i+1;         
                j
                |
                V
        [ 1, 2, 3 ]
        [ 4, 5, 6 ]
    i ->[ 7, 8, 9 ]
and last value is added.
now the new array has the values [9]
since the reverse flag is true, we push the values to return matrix in reverse order.
so return matrix will be [1,2,4,7,5,3,6,8,9]
on incrementing the i, the basic condition i < rows of matrix fails and the loop ends.

Время выполнения приведенного выше алгоритма составляет o (m * n), а пространство для матрицы возврата будет o (m * n).

код в джаваскрипте:

var findDiagonalOrder = function(matrix) {
        var returnMatrix = [],row = matrix.length, j= 0, reverse = true;
        // check if the input matrix is 2d matrix. else return the returnmatrix;
        if(matrix[0]){
            var coloumn = matrix[0].length;
              debugger;
              // basically we are traversing from top to bottom in diagonally.
              // we reverse the values of the traversing alternatively to create the zig-zag pattern
              // we incress the coloumn values from 0 to max column values
              // for each value of the j loop until the j = 0 and i value is less then row value
              // we reverse the values according to reverse flag which toggles for every other time
while(j < coloumn){
        var newarr = [];
        var  i = 0, k = j;
        while( k >= 0 && i < row && i > -1){
            if(matrix[i][k] != undefined){ 
            newarr.push(matrix[i][k]);
             }
            i++;
            k--;
        }
        if(reverse){
            newarr.reverse();
        }
        reverse = !reverse;
        newarr.forEach(elem => returnMatrix.push(elem));
        j++;
    }
              // after reaching the max value of j
              // the j never increases but the i value of the row 
              // increases and the j value decreases and i value increases 
              // similarly we add the values in the zigzag pattern using the reverse flag.
for(var l =1; l < row; l++){
            var j = coloumn-1, i = 0+l; 
            var newarr =[];
//            
            while(j >= 0   && i < row ){
                newarr.push(matrix[i][j]);
                j--; 
                i++;
            }
             if(reverse){
            newarr.reverse();
        }
        reverse = !reverse;
        newarr.forEach(elem => returnMatrix.push(elem));
        }
}
      
    return returnMatrix;
    };

Несколько важных входов и выходов:

testcases passed:
i/p [] o/p: []
i/p [[]] o/p:[]
i/p [[1,2,3,1,2,3],[4,5,6,2,3,4],[7,8,9,2,3,4],[7,8,9,2,3,4]] 
o/p: [1, 2, 4, 7, 5, 3, 1, 6, 8, 7, 8, 9, 2, 2, 3, 3, 2, 9, 2, 3, 4, 4, 3, 4]