螺旋矩阵 II

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

示例:

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

解决思路:首先填写矩阵最外一圈,接着依次向内。

对于n行n列的矩阵,每填一圈余下的矩阵为(n-2)行(n-2)列,这个特点可以作为循环的终止条件。

 

代码如下:

    public static int[][] generateMatrix(int n) {

        if (n==0) return new int[0][0];
        if (n==1) return new int[][]{{1}};
        int[][] matrix = new int[n][n];

        int i,j;
        int b=0; //每一圈填充时,i,j的开始位置, (0,0),(1,1)...(n-1,n-1)
        int m = n; // 每填一圈,行数列数自减2
        int k = 1;
        while(m>0) {

            i = b;
            j = b;
            while(j<n-b-1) matrix[i][j++] =  k++;    // (b,b)->(b,n-b-1) 不包含最后一个
            while(i<n-b-1) matrix[i++][j] = k++;     // (b,n-b-1)->(n-b-1,n-b-1) 不包含最后一个
            while(j>b) matrix[i][j--] = k++;         // (n-b-1,n-b-1)->(n-b-1,b) 不包含最后一个
            while(i>b) matrix[i--][j] = k++;         // (n-b-1,b)->(b,b) 不包含最后一个

            b++;
            m-=2;
        }
        // 若n为奇数,最后一圈为1行1列,上述while循环中没有填写
        if (n%2 == 1) matrix[b-1][b-1] = k;
        return matrix;
    }

 

posted on 2018-05-12 20:37  Deltadeblog  阅读(146)  评论(0编辑  收藏  举报

导航