题目
分析
本题考虑的问题主要是边界的处理问题,即处于其中的四个角落处,很多同学在编写的时候没有注意这里的边界问题,在处理第一行的时候可能是包含了左边界的元素,没有包含右边界的元素。而在处理3到5的时候则是既包含了上边界3又包含了下边界5,这样就造成了错误。因此在编写的时候我们始终要坚持一种处理的方式进行处理,不要在编写的时候改变处理方式。就好比处理区间的问题时,我们如果确定是左闭右开的区间,就要坚持这样,不要一会儿左闭右开,一会儿左闭右闭。
代码(JAVA版)
class Solution {
public int[][] generateMatrix(int n) {
int startx=0,starty=0,offset=1,i=0,j=0,count=1,loop=0;
int nums[][]=new int[n][n];
while(loop++<(n/2))
{
for(j=starty;j<n-offset;j++)
{
nums[startx][j]=count++;
}
for(i=startx;i<n-offset;i++)
{
nums[i][j]=count++;
}
for(;j>starty;j--)
{
nums[i][j]=count++;
}
for(;i>startx;i--)
{
nums[i][j]=count++;
}
startx++;
starty++;
offset++;
}
if(n%2==1)
{
nums[n/2][n/2]=count++;
}
return nums;
}
}
官方代码(JAVA版)
class Solution {
public int[][] generateMatrix(int n) {
int maxNum = n * n;
int curNum = 1;
int[][] matrix = new int[n][n];
int row = 0, column = 0;
int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 右下左上
int directionIndex = 0;
while (curNum <= maxNum) {
matrix[row][column] = curNum;
curNum++;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= n || nextColumn < 0 || nextColumn >= n || matrix[nextRow][nextColumn] != 0) {
directionIndex = (directionIndex + 1) % 4; // 顺时针旋转至下一个方向
}
row = row + directions[directionIndex][0];
column = column + directions[directionIndex][1];
}
return matrix;
}
}