LeetCode-Problem 54:螺旋矩阵

问题描述

给出一个 m x n 的矩阵(m 行, n 列),请按照顺时针螺旋顺序返回元素。

例如,给出以下矩阵:

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

应该返回 [1,2,3,6,9,8,7,4,5]。

算法实现

分四步,右,下,左,上,注意每一步的转向判断(转向条件:当前道路上的下一步已经遍历)。以下是算法实现:

    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> list = new ArrayList<>();
        if (matrix.length == 0) {
            return list;
        }
        int h = matrix.length;
        int w = matrix[0].length;
        boolean[][] flag = new boolean[h][w];

        int index = 0, i = 0, j = 0;
        while (index < h * w) {
            /** * 向右 */
            while (j < w) {
                if (!flag[i][j]) {
                    list.add(matrix[i][j]);
                    flag[i][j] = true;
                    index++;
                }
                /** * 预检,是否已经需要转向 */
                if (j < w - 1 && !flag[i][j + 1]) {
                    j++;
                } else {
                    break;
                }
            }
            /** * 向下 */
            while (i < h) {
                if (!flag[i][j]) {
                    list.add(matrix[i][j]);
                    flag[i][j] = true;
                    index++;
                }
                /** * 预检,是否已经需要转向 */
                if (i < h - 1 && !flag[i + 1][j]) {
                    i++;
                } else {
                    break;
                }
            }
            /** * 向左 */
            while (j >= 0) {
                if (!flag[i][j]) {
                    list.add(matrix[i][j]);
                    flag[i][j] = true;
                    index++;
                }
                /** * 预检,是否已经需要转向 */
                if (j > 0 && !flag[i][j - 1]) {
                    j--;
                } else {
                    break;
                }
            }
            /** * 向上 */
            while (i >= 0) {
                if (!flag[i][j]) {
                    list.add(matrix[i][j]);
                    flag[i][j] = true;
                    index++;
                }
                /** * 预检,是否已经需要转向 */
                if (i > 0 && !flag[i - 1][j]) {
                    i--;
                } else {
                    break;
                }
            }

        }
        return list;
    }
点赞