题目

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]

方法一:设定边界模拟法

要点:

1、循环的顺序一定要清晰且不变,比如这道题就是按照 左到右,上到下,右到左,下到上的顺序一直循环,向内缩进。
2、写的时候要认真,注意缩进时不变量是哪个(比如从左到右,matrix[i][top],第二维的top是不变的)
3、学习一下创建并分配二维vector空间的写法。
4、for循环不写花括号时, 后面跟着那行记得多空几下,不然报错(迷惑)
for(int i=left;i<=right;i++) matrix[top][i] =num++;

  1. class Solution {
  2. public:
  3. vector<vector<int>> generateMatrix(int n) {
  4. // 创建二维矩阵,分配空间并创造对象
  5. vector<vector<int>> matrix(n, vector<int>(n,0));
  6. //另一种循环创建写法
  7. vector<vector<int>> matrix(n);
  8. for(int i=0;i<matrix.size();i++){
  9. matrix[i].resize(n);
  10. }
  11. //设置左右上下四个边界
  12. int left = 0;
  13. int right =n-1;
  14. int top =0;
  15. int bottom =n-1;
  16. int num =1;
  17. while(num <=n*n){
  18. for(int i=left;i<=right;i++) {
  19. matrix[top][i] =num++;
  20. }
  21. top++; //上边界向下收缩一行
  22. for(int i=top;i<=bottom;i++){
  23. matrix[i][right] =num++;
  24. }
  25. right--; //右边界向内收缩一行
  26. for(int i=right;i>=left;i--) {
  27. matrix[bottom][i] =num++;
  28. }
  29. bottom--; //下边界向上收缩一行
  30. for(int i=bottom;i>=top;i--){
  31. matrix[i][left] =num++;
  32. }
  33. left++; //左边界向内收缩一行
  34. }
  35. return matrix;
  36. }
  37. };

JS

第一种还是我自己的那种写法,转一边就缩进一次
第二种是大佬写法,按照圈数来循环
PS:在做mxn的螺旋矩阵时,我发现我的这种while判断会有问题,并不能够在到达数组末尾后立刻退出,导致重复添加

  1. var generateMatrix = function(n) {
  2. let result =new Array(n).fill().map(()=>new Array(n))
  3. let left =0
  4. let right =n -1
  5. let top =0
  6. let bottom =n-1
  7. let num =1
  8. //我这个是左闭右闭
  9. while(num<=n*n){
  10. for(let i=left;i<=right;i++){
  11. result[top][i] =num++
  12. }
  13. top++//上边界向下收缩一行
  14. for(let i=top;i<=bottom;i++){
  15. result[i][right] =num++
  16. }
  17. right--//右边界向内收缩一行
  18. for(let i=right;i>=left;i--){
  19. result[bottom][i] =num++
  20. }
  21. bottom--//下边界向上收缩一行
  22. for(let i=bottom;i>=top;i--){
  23. result[i][left] =num++
  24. }
  25. left++//左边界向内收缩一行
  26. }
  27. return result
  28. };
var generateMatrix = function(n) {
    let startX = startY = 0;   // 起始位置
    let loop = Math.floor(n/2);   // 旋转圈数
    let mid = Math.floor(n/2);    // 中间位置
    let offset = 1;    // 控制每一层填充元素个数
    let count = 1;     // 更新填充数字
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0));

    while (loop--) {
        let row = startX, col = startY;
        // 上行从左到右(左闭右开)
        for (; col < startY + n - offset; col++) {
            res[row][col] = count++;
        }
        // 右列从上到下(左闭右开)
        for (; row < startX + n - offset; row++) {
            res[row][col] = count++;
        }
        // 下行从右到左(左闭右开)
        for (; col > startY; col--) {
            res[row][col] = count++;
        }
        // 左列做下到上(左闭右开)
        for (; row > startX; row--) {
            res[row][col] = count++;
        }

        // 更新起始位置
        startX++;
        startY++;

        // 更新offset
        offset += 2;
    }
    // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
    if (n % 2 === 1) {
        res[mid][mid] = count;