1. class Solution {
    2. public:
    3. vector<vector<int>> generateMatrix(int n) {
    4. vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
    5. int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
    6. int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
    7. int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
    8. int count = 1; // 用来给矩阵中每一个空格赋值
    9. int offset = 1; // 每一圈循环,需要控制每一条边遍历的长度
    10. int i,j;
    11. while (loop --) {
    12. i = startx;
    13. j = starty;
    14. // 下面开始的四个for就是模拟转了一圈
    15. // 模拟填充上行从左到右(左闭右开)
    16. for (j = starty; j < starty + n - offset; j++) {
    17. res[startx][j] = count++;
    18. }
    19. // 模拟填充右列从上到下(左闭右开)
    20. for (i = startx; i < startx + n - offset; i++) {
    21. res[i][j] = count++;
    22. }
    23. // 模拟填充下行从右到左(左闭右开)
    24. for (; j > starty; j--) {
    25. res[i][j] = count++;
    26. }
    27. // 模拟填充左列从下到上(左闭右开)
    28. for (; i > startx; i--) {
    29. res[i][j] = count++;
    30. }
    31. // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
    32. startx++;
    33. starty++;
    34. // offset 控制每一圈里每一条边遍历的长度
    35. offset += 2;
    36. }
    37. // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
    38. if (n % 2) {
    39. res[mid][mid] = count;
    40. }
    41. return res;
    42. }
    43. };
    class Solution {
        public int[][] generateMatrix(int n) {
            int[][] ans = new int[n][n];
    
            int up = 0;
            int down = n-1;
            int left = 0;
            int right = n-1;
    
            int nums = 1;
            while(nums<=Math.pow(n,2)){
                //横着向右填充
                for(int i=left; i<=right; i++){
                    ans[up][i] = nums;
                    nums++;
                }
                up += 1;
    
                //纵着向下填充
                for(int i=up; i<= down; i++){
                    ans[i][right] = nums;
                    nums++;
                }
                right -= 1;
    
                //横着向左填充
                for(int i=right; i>=left; i--){
                    ans[down][i] = nums;
                    nums++;
                }
                down -= 1;
    
                //纵着向上填充
                for(int i=down; i>=up; i--){
                    ans[i][left] = nums;
                    nums++;
                }
                left += 1;
            }
            return ans;
        }
    }