[Leetcode] spiral matrix ii 螺旋矩阵

Given an integer n, generate a square matrix filled with elements from 1 to n 2 in spiral order.

For example,
Given n =3,

You should return the following matrix:

[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

题意:给定整数n,以螺旋的方式形成一个n×n个矩阵。

思路:这题的思路和spiral matrix 一样。还是按照螺旋的方式去赋值,由外到内的一层层赋值。这两题的区别在于,本题中,不可能剩下1×k或者k×1的区域没有赋值,因为这个是一个正方形,所以在讨论最初和最后情况时,只需要一个if条件判断即可。还有一点要注意的是,返回值一定要先赋值,不然用下标访问不存在的地方会报错。代码如下:

 1 class Solution {
 2 public:
 3     vector<vector<int> > generateMatrix(int n) 
 4     {
 5         vector<vector<int>> matrix(n,vector<int>(n,0));
 6         if(n==0)    return matrix;
 7 
 8         int left=0,right=n-1;
 9         int up=0,down=n-1;
10         int num=1;
11         
12         while(right>=left && down>=up)
13         {
14             if(right==left)
15             {
16                 matrix[up][right]=num;
17                 return matrix;
18             }
19             
20             for(int i=left;i<right;++i)
21             {
22                 matrix[up][i]=num;
23                 num++;
24             }
25             for(int i=up;i<down;++i)
26             {
27                 matrix[i][right]=num;
28                 num++;
29             }
30             for(int i=right;i>left;i--)
31             {
32                 matrix[down][i]=num;
33                 num++;
34             }
35             for(int i=down;i>up;i--)
36             {
37                 matrix[i][left]=num;
38                 num++;
39             }
40 
41             left++;
42             right--;
43             up++;
44             down--;
45         }
46         return matrix;
47 
48     }
49 };

方法二:也可以使用旋转图片中的思想,只不过比较难想一些。代码如下:

 1 class Solution
 2 {
 3 public:
 4     vector<vector<int>> generateMatrix(int n)
 5     {
 6         vector<vector<int>> matrix(n,vector<int>(n,0));       //一定要给matrix给赋值。
 7        // 由外层到里,一层考虑
 8         if(n==1)
 9         {
10             matrix[0][0]=1;
11             return matrix;
12         }
13         int temp=1;
14         //层数
15         for(int layer=0;layer<n/2;++layer)
16         {
17             int first=layer;
18             int last=n-1-layer;
19             int num=last-first;
20             //每一层上,每一行、列,找出相应规律,都从顶点赋值
21             for(int i=first;i<last;++i)
22             {
23                 int offset=i-first;
24                 matrix[first][i]=temp+i;
25                 matrix[i][last]=temp+num+i;
26                 matrix[last][last-offset]=temp+2*num+i;
27                 matrix[last-offset][first]=temp+3*num+i;
28             }
29             temp+=4*num-1;
30         }
31         //当n为奇数时,最中心的一个为n^2
32         if(n%2==1)  matrix[n/2][n/2]=n*n;
33         return matrix;
34     }
35 };
原文地址:https://www.cnblogs.com/love-yh/p/7101549.html