Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
题目要求n × n矩阵用1 到n^n的数字环形围绕起来
显然,数字是递增的,我首先分别打印出了在n = 5的情况下的 行列坐标的值,就直接发现了规律了
n = 5的情况,第一次行列的最大和最小分别是1 5
行:1,1,1,1, 1,2,3,4,5, 5,5,5,5, 4,3,2
列:1,2,3,4, 5,5,5,5,5, 4,3,2,1, 1,1,1
第二次的行列的最大和最小分别是 2, 4
行: 2,2, 2,3,4, 4,4, 3
列: 2,3, 4,4,4, 3,2, 2
看了这两个例子后我直接推出规律:
对于 假设行列的最大最小分别是max, min
对应的row col坐标
row 的坐标= (max - min + 1) 个min, min + 1 ......max - 1, (max - min + 1)个max, max - 1, max - 2 ......min + 1
col 的坐标= min, min + 1 ......max, (max - min - 1)个max,min, min + 1,......max, (max - min - 1)个min
具体看代码,很直白的,代码如下:
public class Solution {
public int[][] generateMatrix(int n) {
int arr[][] = null;
if(n >= 0){
arr = new int[n][n];
int num = 1;
int len = n * n;
int row = 0, col = n - 1;
while(row < col){
for(int i = row; i <= col; ++i){
arr[row][i] = num++;
}
for(int i = row + 1; i < col; ++i){
arr[i][col] = num++;
}
for(int i = col; i >= row; --i){
arr[col][i] = num++;
}
for(int i = col - 1; i > row; --i){
arr[i][row] = num++;
}
row++;
col--;
}
if(row == col)arr[row][col] = num;
}
return arr;
}
}