leetcode 59. 螺旋矩阵 II 击败20.83%

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

示例:

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

 public int[][] generateMatrix(int n) {
        if (n == 1) {
            int[][] A = new int[1][1];
            A[0][0] = 1;
            return A;
        }
        int[][] A = new int[n][n];
        //0代表往右,1代表往下,2代表往左,3代表往上
        int direct = 0;
        //从A[0][0]开始
        int i = 0, j = 0;
        int count = 2;
        A[0][0] = 1;
        while (true) {
            //往右
            if (direct == 0) {
                //不能再往右边走了
                if (j == n - 1 || A[i][j + 1] != 0) {
                    //下面也访问过,说明访问完了,可以直接返回
                    if (A[i + 1][j] != 0) {
                        return A;
                    } else {
                        //往下
                        direct = 1;
                        A[i + 1][j] = count++;
                        i++;
                    }
                } else {
                    //继续往右
                    A[i][j + 1] = count++;
                    j++;
                }
            } else if (direct == 1) {
                //不能再往下边走了
                if (i == n - 1 || A[i + 1][j] != 0) {
                    //左边也访问过,说明访问完了,可以直接返回
                    if (A[i][j - 1] != 0) {
                        return A;
                    } else {
                        direct = 2;
                        A[i][j - 1] = count++;
                        j--;
                    }
                } else {
                    //继续往下
                    A[i + 1][j] = count++;
                    i++;
                }
            } else if (direct == 2) {
                //不能再往左边走了
                if (j == 0 || A[i][j - 1] != 0) {
                    //上面也访问过,说明访问完了,可以直接返回
                    if (A[i - 1][j] != 0) {
                        return A;
                    } else {
                        //往上
                        direct = 3;
                        A[i - 1][j] = count++;
                        i--;
                    }
                } else {
                    //继续往左
                    A[i][j - 1] = count++;
                    j--;
                }
            } else if (direct == 3) {
                //不能再往上边走了
                if (i == 0 || A[i - 1][j] != 0) {
                    //右边也访问过,说明访问完了,可以直接返回
                    if (A[i][j + 1] != 0) {
                        return A;
                    } else {
                        direct = 0;
                        A[i][j + 1] = count++;
                        j++;
                    }
                } else {
                    //继续往上
                    A[i - 1][j] = count++;
                    i--;
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章