@@ -715,26 +715,65 @@ object Solution {
715
715
### C#:
716
716
717
717
``` 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 -- )
727
760
{
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 ;
737
775
}
776
+ return result ;
738
777
}
739
778
```
740
779
0 commit comments