• 59.螺旋矩阵Ⅱ

    代码:(详细注释)

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

    分析:
    左闭右开
    image.png
    当n=3的时候,这个边长就是3,3*3=9,这样的格子又刚好放九个数那便是1到n^2