每天一题LeetCode【第41天】

2017-04-08  本文已影响69人  草稿纸反面

T59. Spiral Matrix II【Medium

题目

给一个整数 n,构造一个 1~n² 的螺旋排序的正方形矩阵。

例如:

当 n = 3 时,

应该返回如下矩阵:

[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路

这题和 leetcode 第 54 题解决方法几乎一样。

(在我的 每天一题LeetCode【第39天】 有对第 54 题的分析)

接下来说本题思路,首先还是拿出这张丑图 (*  ̄∇ ̄*):

画圈圈时有三个要点:

① 画完一行(列),下次再到这行(列)时会画它的内圈

② 当画到最后,两线不能相交(就是下面的 boundriesCrossed 的作用)

③ 每画一个点都是前面的点的数字 + 1

代码

代码取自 Top Solution,稍作注释

 public int[][] generateMatrix(int n) {
        // 简历一个 n × n 的矩阵
        int[][] matrix = new int[n][n];
        // 若为 0 则直接返回
        if (n == 0) {
            return matrix;
        } 
        // 设置初始值
        int rowStart = 0;
        int rowEnd = n-1;
        int colStart = 0;
        int colEnd = n-1;
        int num = 1; //change
        //看有没有越界,有的话循环结束
        while (rowStart <= rowEnd && colStart <= colEnd) {
            // 画上面的那行
            for (int i = colStart; i <= colEnd; i ++) {
                matrix[rowStart][i] = num ++; //change
            }
            //下一次内行
            rowStart ++;
            // 画最右边的列
            for (int i = rowStart; i <= rowEnd; i ++) {
                matrix[i][colEnd] = num ++; //change
            }
            //下一次内列
            colEnd --;
            // 画最下边的列
            for (int i = colEnd; i >= colStart; i --) {
                if (rowStart <= rowEnd)
                    matrix[rowEnd][i] = num ++; //change
            }
            //下一次内行
            rowEnd --;
            // 画最左边的列
            for (int i = rowEnd; i >= rowStart; i --) {
                if (colStart <= colEnd)
                    matrix[i][colStart] = num ++; //change
            }
            //下一次内列
            colStart ++;
        }
        
        return matrix;
    }
上一篇 下一篇

猜你喜欢

热点阅读