题目描述

给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

示例:

输入: 3
输出:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路

1.这道题的思路与54.螺旋矩阵类似,只不过将打印变成了赋值,我们可以设置一个count用于记录当前打印的进度,若达到了最大值则已经完成了赋值,将结果返回即可。

Java代码实现

    public int[][] generateMatrix(int n) {
        int count = 1;
        int[][] res = new int[n][n];

        int row = n-1;
        int col = n-1;

        int[] leftUp = new int[]{0,0};
        int[] rightUp = new int[]{0,col};
        int[] leftDown= new int[]{row,0};
        int[] rightDown = new int[]{row,col};

        while(count>0){
            //从 左上 往 右上   变的是纵坐标
            for (int i = leftUp[1]; i <= rightUp[1] && count<=n*n; i++) {
                res[leftUp[0]][i] = count;
                count++;
            }
            //左上  和  右上的横坐标+1
            leftUp[0]++;
            rightUp[0]++;

            //从 右上 往 右下   变的是横坐标
            for (int i = rightUp[0]; i <= rightDown[0] && count<=n*n; i++) {
                res[i][rightUp[1]] = count;
                count++;
            }
            //右上 和 右下的纵坐标 -1
            rightUp[1]--;
            rightDown[1]--;

            //从 右下 往 左下  变的是纵坐标
            for (int i = rightDown[1]; i >= leftDown[1]&& count<=n*n; i--) {
                res[leftDown[0]][i] = count;
                count++;
            }

            //右下 和 左下的 横坐标 -1
            rightDown[0]--;
            leftDown[0]--;

            //从 左下 往 左上 变的是横坐标
            for (int i = leftDown[0]; i >=leftUp[0] && count<=n*n; i--) {
                res[i][leftDown[1]] = count;
                count++;
            }

            //左下 和 左上的 纵坐标 +1
            leftDown[1]++;
            leftUp[1]++;
        }
        return res;
    }