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 };