xiaomi

个人博客

小米的个人博客,欢迎交流


每天一道剑指Offer:顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

麻烦、曲折、令人头疼的题目🤦‍
刚开始把题目看成了n * n的矩阵…痛哭流涕,看题一定要清晰!!

思路

矩阵有四种情况:

  1. 空矩阵
  2. 1 * n 矩阵 {1,2,3,4}
  3. n * m 矩阵 {{1,2,3,4},{5,6,7,8},{9,10,11,12}}
  4. m * n 矩阵 {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}
  • 设置四个始末变量
    • stX stY endX endY
  • 顺时针顺序打印就是up right down left 这个顺序来打印矩阵
    • 每次打印完一个方向,我们就改变始末变量的值
      • 一共有 row*col 个元素,每次 add 我们都 count++
      • 直到 count == cow*col 为止打印结束

代码实现

 public ArrayList<Integer> printMatrix(int[][] matrix) {
        if (matrix == null) return null;

        int col = matrix[0].length;
        int row = matrix.length;
        ArrayList<Integer> res = new ArrayList<>();

        int tmp = Math.min(col, row);
        int circle = ((tmp & 1) == 1) ? (tmp / 2 + 1) : (tmp / 2);

        int count = 0;
        int all = col * row;
        int stX = 0;
        int stY = 0;
        int endX = col - 1;
        int endY = row - 1;

        for (int cir = 1; cir <= circle; cir++) {
//            up
            for (int i = stX; i <= endX; i++) {
                res.add(matrix[cir - 1][i]);
                count++;

            }
            if (count == all) break;
//            改变right方向的起始位置
            stY++;

//            right
            for (int i = stY; i <= endY; i++) {
                res.add(matrix[i][col - cir]);
                count++;
            }
            if (count == all) break;
//            改变down方向的起始位置
            endX--;

//            down
            for (int i = endX; i >= stX; i--) {
                res.add(matrix[row - cir][i]);
                count++;
            }
            if (count == all) break;
//            改变left的起始位置
            endY--;

//            left
            for (int i = endY; i >= stY; i--) {
                res.add(matrix[i][cir - 1]);
                count++;
            }
            if (count == all) break;
//            改变up方向的起始位置
            stX++;
        }
        return res;
    }