54.螺旋矩阵

题目链接

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例1:

【LeetCode】54.螺旋矩阵 - 图1

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

示例2:

【LeetCode】54.螺旋矩阵 - 图2

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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100
class Solution {
   public List<Integer> spiralOrder(int[][] matrix) {
        int lenY = matrix.length;
        int lenX = matrix[0].length;
        int num = lenX * lenY;
        int count = 0;
        // 遍历下标
        int i = 0;
        int j = 0;
        // 循环次数
        int loop = Math.min(lenX, lenY) / 2;
        int midX = lenX / 2;
        int midY = lenY / 2;
        // 偏移量
        int offsetX = 1;
        int offsetY = 1;
        // 结果列表
        List list = new ArrayList();
        while (loop > 0){
            // 上
            while (j < lenX - offsetX){
                list.add(matrix[i][j]);
                count++;
                j++;
            }
            // 右
            while (i < lenY - offsetY){
                list.add(matrix[i][j]);
                i++;
                count++;
            }
            // 下
            while (j > offsetX - 1){
                list.add(matrix[i][j]);
                j--;
                count++;
            }
            // 左
            while (i > offsetY - 1){
                list.add(matrix[i][j]);
                i--;
                count++;
            }
            loop--;
            offsetX++;
            offsetY++;
            i++;
            j++;
            if(count == num){
                return list;
            }
        }
        if(lenX < lenY){
            for(;i < lenY - Math.min(lenX, lenY) / 2;i++){
                list.add(matrix[i][j]);
            }
        }
        if(lenX > lenY){
            for(;j < lenX - Math.min(lenX, lenY) / 2;j++){
                list.add(matrix[i][j]);
            }
        }
        if(lenX == lenY && lenX % 2 != 0){
            list.add(matrix[midX][midY]);
        }
        return list;
    }
}