美文网首页
54#螺旋矩阵

54#螺旋矩阵

作者: 鱼枕 | 来源:发表于2018-08-30 09:16 被阅读0次

    题目描述

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

    示例 1:

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

    示例 2:

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

    分析

    这一题跟昨天的对角线遍历有点相似,可以采用从外到内,一层一层地遍历每一个元素。

    https://leetcode.com/problems/spiral-matrix/Figures/54_spiralmatrix.png

    如图所示,矩阵中的数字代表层数,最外层是第一层,依次往内。每一层按上右下左的顺序(就是题目要求的顺时针方向)遍历每一个元素,将它们存在一个动态数组中。

    源码

    public List<Integer> spiralOrder(int[][] matrix)
    {
        List result = new ArrayList();
        if (matrix.length == 0)
            return result;
        int r1 = 0, r2 = matrix.length - 1;     // 规定当前层的上下边界
        int c1 = 0, c2 = matrix[0].length - 1;  // 规定当前层的左右边界
        while (r1 <= r2 && c1 <= c2)
        {
            for (int c = c1; c <= c2; c++)  result.add(matrix[r1][c]);
            for (int r = r1 + 1; r <= r2; r++)  result.add(matrix[r][c2]);
            if (r1 < r2 && c1 < c2)
            {
                for (int c = c2 -1; c > c1; c--)    result.add(matrix[r2][c]);
                for (int r = r2; r > r1; r--)       result.add(matrix[r][c1]);
            }
            // 往内部进一层
            r1++;
            r2--;
            c1++;
            c2--;
        }
        return result;
    }
    

    测试用例

    public static void main(String[] args)
    {
        SpiralMatrix sm = new SpiralMatrix();
        int[][] a = {{1,2,3},{4,5,6},{7,8,9}};
        System.out.println(sm.spiralOrder(a));
    }
    

    输出:

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

    相关文章

      网友评论

          本文标题:54#螺旋矩阵

          本文链接:https://www.haomeiwen.com/subject/epxrwftx.html