LeetCode 54 螺旋矩阵

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

思路

顺时针循环扫描可以将每个循环分为四个阶段
1. 在第一行 从第一列扫描至最后一列
2. 在最后一列 从 第二行扫描到最后一行
3. 在最后一行 从 倒数第二列 扫描到 第一列
4. 在第一列 从 倒数第二行 扫描的 第二行
使用两个参数col row 来作为工作指针进行扫描。Sc、Sr用来表示行列的起始行列数,Ec、Er用来表示行列扫描的结束行列数。每次循环结束时,对着四个参数进行更新。
注意:
1. 循环需要满足 第一行起始行列数需要小于等于结束行列数。
2. 在每个循环的第一个阶段完成之后 需要判断当前矩阵是否已经只有一行,如果只有一行则没必要进行下面的步骤,直接break。
3. 在每个循环的第二阶段完成之后 需要判断 当前矩阵是否已经只有一列,如果只有一列则没必要进行下面的步骤,直接break。(如果进行了下面的步骤,会对元素重复扫描)
4. 每个阶段进行扫描时需要对col row 进行初始化

代码

import java.util.ArrayList;
import java.util.List;

public class Spiral_Matrix_54 {
    /**
     * @return java.util.List<java.lang.Integer>
     * @author chy
     * @creed: Talk is cheap,show me the code
     * @date 27/5/2019 8:31 PM
     * @desc: 54 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
     */
    public List<Integer> spiralOrder(int[][] matrix) {
        if (matrix.length == 0)
            return new ArrayList<>();
        int Sr = 0, Sc = 0, Ec = matrix[0].length - 1, Er = matrix.length - 1;
        List<Integer> res = new ArrayList<>();

        while (Sc <= Ec && Sr <= Er) {
            int row = Sr, col = Sc;
            for (; col <= Ec; col++)
                res.add(matrix[row][col]);
            if (Sr == Er)
                break;
            for (col = Ec, row = Sr + 1; row <= Er; row++)
                res.add(matrix[row][col]);
            if (Sc == Ec)
                break;
            for (row = Er, col = Ec - 1; col >= Sc; col--)
                res.add(matrix[row][col]);
            for (col = Sc, row = Er - 1; row >= Sr + 1; row--)
                res.add(matrix[row][col]);
            Sc++;
            Sr++;
            Ec--;
            Er--;
        }
        return res;
    }

    public static void main(String[] argc) {
        List<Integer> res = new Spiral_Matrix_54().spiralOrder(new int[][]{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}});
        return;
    }
}

发布了42 篇原创文章 · 获赞 0 · 访问量 2022

猜你喜欢

转载自blog.csdn.net/c630565685/article/details/90632530