@@ -715,26 +715,65 @@ object Solution {
715715### C#:
716716
717717``` csharp
718- public class Solution {
719- public int [][] GenerateMatrix (int n ) {
720- int [][] answer = new int [n ][];
721- for (int i = 0 ; i < n ; i ++ )
722- answer [i ] = new int [n ];
723- int start = 0 ;
724- int end = n - 1 ;
725- int tmp = 1 ;
726- while (tmp < n * n )
718+ public int [][] GenerateMatrix (int n )
719+ {
720+ // 参考Carl的代码随想录里面C++的思路
721+ // https://www.programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#%E6%80%9D%E8%B7%AF
722+ int startX = 0 , startY = 0 ; // 定义每循环一个圈的起始位置
723+ int loop = n / 2 ; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
724+ int count = 1 ; // 用来给矩阵每个空格赋值
725+ int mid = n / 2 ; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
726+ int offset = 1 ;// 需要控制每一条边遍历的长度,每次循环右边界收缩一位
727+
728+ // 构建result二维数组
729+ int [][] result = new int [n ][];
730+ for (int k = 0 ; k < n ; k ++ )
731+ {
732+ result [k ] = new int [n ];
733+ }
734+
735+ int i = 0 , j = 0 ; // [i,j]
736+ while (loop > 0 )
737+ {
738+ i = startX ;
739+ j = startY ;
740+ // 四个For循环模拟转一圈
741+ // 第一排,从左往右遍历,不取最右侧的值(左闭右开)
742+ for (; j < n - offset ; j ++ )
743+ {
744+ result [i ][j ] = count ++ ;
745+ }
746+ // 右侧的第一列,从上往下遍历,不取最下面的值(左闭右开)
747+ for (; i < n - offset ; i ++ )
748+ {
749+ result [i ][j ] = count ++ ;
750+ }
751+
752+ // 最下面的第一行,从右往左遍历,不取最左侧的值(左闭右开)
753+ for (; j > startY ; j -- )
754+ {
755+ result [i ][j ] = count ++ ;
756+ }
757+
758+ // 左侧第一列,从下往上遍历,不取最左侧的值(左闭右开)
759+ for (; i > startX ; i -- )
727760 {
728- for (int i = start ; i < end ; i ++ ) answer [start ][i ] = tmp ++ ;
729- for (int i = start ; i < end ; i ++ ) answer [i ][end ] = tmp ++ ;
730- for (int i = end ; i > start ; i -- ) answer [end ][i ] = tmp ++ ;
731- for (int i = end ; i > start ; i -- ) answer [i ][start ] = tmp ++ ;
732- start ++ ;
733- end -- ;
734- }
735- if (n % 2 == 1 ) answer [n / 2 ][n / 2 ] = tmp ;
736- return answer ;
761+ result [i ][j ] = count ++ ;
762+ }
763+ // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
764+ startX ++ ;
765+ startY ++ ;
766+
767+ // offset 控制每一圈里每一条边遍历的长度
768+ offset ++ ;
769+ loop -- ;
770+ }
771+ if (n % 2 == 1 )
772+ {
773+ // n 为奇数
774+ result [mid ][mid ] = count ;
737775 }
776+ return result ;
738777}
739778```
740779
0 commit comments