public class Solution { public int[] FindDiagonalOrder(int[][] mat) { if (mat == null || mat.Length == 0 || mat[0].Length == 0) { return new int[0]; } var m = mat.Length; var n = mat[0].Length; var diagonals = new Dictionary>(); for (var i = 0; i < m; i++) { for (var j = 0; j < n; j++) { int diagonalIndex = i + j; if (!diagonals.ContainsKey(diagonalIndex)) { diagonals[diagonalIndex] = new List(); } diagonals[diagonalIndex].Add(mat[i][j]); } } var result = new List(); foreach (var key in diagonals.Keys) { var diagonal = diagonals[key]; if (key % 2 == 0) { result.AddRange(diagonal); } else { diagonal.Reverse(); result.AddRange(diagonal); } } return result.ToArray(); } } class Program { static void Main() { var Solution = new Solution(); int[][] mat1 = new int[][]{ new int[]{1,2,3}, new int[]{4,5,6}, new int[]{7,8,9} }; Console.WriteLine(string.Join(", ", Solution.FindDiagonalOrder(mat1))); } }