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;
    }
}
![[天天向上] 学习方法论-事半功倍的问题解决方法](https://img-blog.csdnimg.cn/direct/a18944f9efc34c179904387d9aeb086a.png#pic_center)


















