【剑指Offer题解:java】顺时针打印矩阵

文章目录

    • 题目
    • 分析
    • 代码

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

分析

定义四个变量分别代表矩阵的四条边:top,right,down,left

  1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 top++,同时判断是否和代表下边界的 down 交错
  2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right–,同时判断是否和代表左边界的 left 交错
  3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down–,同时判断是否和代表上边界的 top 交错
  4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left++,同时判断是否和代表右边界的 right 交错

【剑指Offer题解:java】顺时针打印矩阵_第1张图片

代码

public ArrayList<Integer> printMatrix(int[][] matrix) {
     
        ArrayList<Integer> list = new ArrayList<>();
        if (matrix == null || matrix.length == 0) return list;
        //定义四个变量
        int top = 0, dowm = matrix.length - 1, left = 0, right = matrix[0].length - 1;
        while (true) {
     
            //先对顶行进行处理
            for (int i = left; i <= right; i++) {
     
                list.add(matrix[top][i]);
            }
            top++;//将top向下移动
            //判断底层和上层是否已经交错
            if (top > dowm) break;
            //再对右边一列进行处理
            for (int i = top; i <= dowm; i++) {
     
                list.add(matrix[i][right]);
            }
            right--;//右边指针向左移动
            //判断左边和右边是否已经交错
            if (left > right) break;
            //再对down处理=>从右往左进行遍历
            for (int i = right; i >= left; i--) {
     
                list.add(matrix[dowm][i]);
            }
            dowm--;//底层向上移动
            if (top > dowm) break;
            //最后对左边进行遍历=>从下往上遍历
            for (int i = dowm; i >= top; i--) {
     
                list.add(matrix[i][left]);
            }
            left++;//向右移动
            if (left > right) break;
        }
        return list;
    }

你可能感兴趣的:(#,剑指Offer题解,数据结构,算法,java,leetcode)