1.题目
2.思路
(借用代码随想录的图)
1.我们将转一圈看作一个循环(1->2->3->4->5->6->7->8 这是一个循环)
2.在这个循环里,我们要画四条边(上右下左)
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
3.因为画这四条边,有重复元素,我们为了统一处理拐角处元素的规则,规定拐角处都让给新的一条边,就是上图不同颜色的边
4. 这样就有两个循环了(第一个循环表示要绘制多少个四条边,第二个循环里绘制四条边)
3.实施细节
1.在画每一条边的时候,我们首先考虑到的第一个问题是:怎么把数写到对应位置去?
解决:设置一个遍历参数,表示当前的位置
ori_i (表示当前位置的横坐标), ori_j(表示当前位置的列坐标)
res[ori_i][ori_j]= num;
2.接下来会遇到:什么时候该画下一条边?
解决:设置边界参数,按3*3矩阵举例
col_max=2(列最大边界)col_min=0(列最小边界)
row_max=2(行最大边界) row_min=0
拿上行从左到右举例:当遍历参数ori_j <= col_max 时画这条边
其他三条边类推
3 画完这四条边后,就该进入到下一个循环了,该继续画下一个四条边了。这时候我们要设置开始绘制的起点。通过一个start参数来设置每次循环的起点
4 要注意当n=奇数的时候,最后最中间会只留下一个小块,这个时候我们规定这四条边都不绘制中间的小块,我们跳出循环,单独给这个小块赋值!
5 怎样判断绘制结束?
解决:当row_min>= row_max 时结束!
注意这里是大于等于 因为当row_min=row_max的时候表示只剩下中间一个小块了,而根据4.的规定,中间小块我们要跳出循环来单独赋值
4.Java代码实现
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int start = 0; //定义初始点
//定义边界
int row_max = n - 1;
int col_max = n - 1;
int row_min = 0;
int col_min = 0;
int num = 1; //定义要写的数
while (row_max > row_min) {
int ori_i = start;
int ori_j = start;
//上侧从左到右
for (; ori_j <= col_max - 1; ori_j++) {
res[ori_i][ori_j] = num;
num++;
}
//右侧从上到下
for (; ori_i <= row_max - 1; ori_i++) {
res[ori_i][ori_j] = num;
num++;
}
//下侧从右往左
for (; ori_j >= col_min + 1; ori_j--) {
res[ori_i][ori_j] = num;
num++;
}
//左侧从下往上
for (; ori_i >= row_min + 1; ori_i--) {
res[ori_i][ori_j] = num;
num++;
}
//更新边界
row_max--;
col_max--;
row_min++;
col_min++;
//更新初始点
start++;
}
//如果是奇数,需要给最中间的单独赋值
if (n % 2 == 1) {
res[start][start] = num;
}
return res;
}
}