54.螺旋矩阵

54.螺旋矩阵

文章目录

  • 题目分析
  • Solution

题目分析

  • 先加最外一圈,一层一层向内,利用四个指针来确定处在哪一圈
  • 矩阵分为偶数行和奇数行两种情况
    54.螺旋矩阵_第1张图片
  • 奇数行、偶数列的时候有问题,当添加完left top -> right top,top++之后,top越过bottom
  • 但是第二步right top -> right bottom不会执行,right–
  • 但是第三步right bottom -> left bottom会在执行一次,所以要break
    54.螺旋矩阵_第2张图片

Solution

    public List<Integer> spiralOrder(int[][] matrix) {
     
        if (matrix == null) return null;
        List<Integer> res = new ArrayList<>();
        if (matrix.length == 0) return res;

        int top = 0;
        int bottom = matrix.length - 1;
        int left = 0;
        int right = matrix[0].length - 1;
        while (top <= bottom && left <= right) {
     
            // left top -> right top
            for (int i = left; i <= right; i++) {
     
                res.add(matrix[top][i]);
            }
            top++;

            // right top -> right bottom
            for (int i = top; i <= bottom; i++) {
     
                res.add(matrix[i][right]);
            }
            right--;

            // 奇数行、偶数列的时候有问题
            if (top > bottom || left > right) break;

            // right bottom -> left bottom
            for (int i = right; i >= left; i--) {
     
                res.add(matrix[bottom][i]);
            }
            bottom--;

            // left bottom -> left top
            for (int i = bottom; i >= top; i--) {
     
                res.add(matrix[i][left]);
            }
            left++;
        }

        return res;
    }

Reference:小码哥MJ

你可能感兴趣的:(LeetCode,算法)