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