public class Solution { public int[][] SortMatrix(int[][] grid) { // 左下 var leftDiagonals = new Dictionary>(); for (var i = 0; i < grid.Length; i++) { // total -> 2n + 1 way for (var j = 0; j <= i; j++) { int diagonal = i - j; if (!leftDiagonals.ContainsKey(diagonal)) { leftDiagonals[diagonal] = new List(); } leftDiagonals[diagonal].Add(grid[i][j]); } } // 右上 var rightDiagonals = new Dictionary>(); for (var i = 0; i < grid.Length; i++) { for (var j = i; j < grid.Length; j++) { int diagonal = j - i; if (!rightDiagonals.ContainsKey(diagonal)) { rightDiagonals[diagonal] = new List(); } rightDiagonals[diagonal].Add(grid[i][j]); } } foreach (var diagonal in leftDiagonals.Values) { diagonal.Sort((a, b) => b.CompareTo(a)); } foreach (var diagonal in rightDiagonals.Values) { diagonal.Sort((a, b) => a.CompareTo(b)); } for (var i = 0; i < grid.Length; i++) { for (var j = 0; j <= i; j++) { int diagonal = i - j; grid[i][j] = leftDiagonals[diagonal][0]; leftDiagonals[diagonal].RemoveAt(0); } for (var j = i; j < grid.Length; j++) { if (i == j) continue; int diagonal = j - i; grid[i][j] = rightDiagonals[diagonal][0]; rightDiagonals[diagonal].RemoveAt(0); } } return grid; } } public class Solution2 { public int[][] SortMatrix(int[][] grid) { int n = grid.Length; for (int i = 0; i < n; i++) { List tmp = new List(); for (int j = 0; i + j < n; j++) { tmp.Add(grid[i + j][j]); } tmp.Sort((a, b) => b.CompareTo(a)); for (int j = 0; i + j < n; j++) { grid[i + j][j] = tmp[j]; } } for (int j = 1; j < n; j++) { List tmp = new List(); for (int i = 0; j + i < n; i++) { tmp.Add(grid[i][j + i]); } tmp.Sort(); for (int i = 0; j + i < n; i++) { grid[i][j + i] = tmp[i]; } } return grid; } } class Program { static void Main() { var Solution = new Solution(); var gird = new int[][] { [1, 7, 3], [9, 8, 2], [4, 5, 6] }; var result = Solution.SortMatrix(gird); for (int i = 0; i < result.Length; i++) { for (int j = 0; j < result[i].Length; j++) { Console.Write(result[i][j] + " "); } Console.WriteLine(); } } }