剑指 Offer 29. 顺时针打印矩阵


剑指 Offer 29. 顺时针打印矩阵

解题思路

顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。因此,考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。
在这里插入图片描述

主要流程:

  1. 根据边界打印,即将元素按顺序添加至列表 res 尾部;
  2. 边界向内收缩 1 (代表已被打印);
  3. 判断是否打印完毕(边界是否相遇),若打印完毕则跳出。

代码

class Solution {
public int[] spiralOrder(int[][] matrix) {
        if (matrix.length == 0) {
            return new int[]{};
        }
        int left = 0;
        int right = matrix[0].length - 1;
        int up = 0;
        int down = matrix.length - 1;
        int x = 0;//res的下标
        int[] res = new int[matrix.length * matrix[0].length];

        while (true) {
            //从左往右
            for (int i = left; i <= right; i++) {
                //这里要掌握技巧:从左往右,行不变,列变,所以找一个不变的行,就是up
                res[x] = matrix[up][i];
                x++;
            }
            //边界收缩:遍历完了一行,那么up就下一一行
            up++;
            //遍历完了,边界收缩,看看是否越界,也就是是否打印完了
            if (up > down) {
                break;
            }

            //从上往下
            for (int i = up; i <= down; i++) {
                res[x] = matrix[i][right];
                x++;
            }
            right--;
            if (right < left) {
                break;
            }

            //从右往左
            for (int i = right; i >= left; i--) {
                res[x] = matrix[down][i];
                x++;
            }
            down--;
            if (down < up) {
                break;
            }

            //从下往上
            for (int i = down; i >= up; i--) {
                res[x] = matrix[i][left];
                x++;
            }
            left++;
            if (left > right) {
                break;
            }


        }
        return res;
    }
}

文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录