剑指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.

分析

思路一:

约瑟夫环,举例,画图,找规律,写函数,逐步逆向递归

代码:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> res = new ArrayList<>();
        if(matrix == null || matrix.length == 0) return res;
        int tR = 0, tC = 0, dR = matrix.length - 1, dC = matrix[0].length - 1;
        while(tR <= dR && tC <= dC) {
            printEdge(matrix, tR++, tC++, dR--, dC--, res);
        }
        return res;
    }
    
    public void printEdge(int[][] matrix, int tR, int tC, int dR, int dC, ArrayList<Integer> res) {
        //1. 如果矩阵只剩一行
        if(tR == dR) {
            for(int i = tC; i <= dC; i++) {
                res.add(matrix[tR][i]);
            }
        } else if (tC == dC) {
            //2. 如果只剩一列
            for(int i = tR; i <= dR; i++) {
                res.add(matrix[i][tC]);
            }
        } else {
            //3. 一般过程,上->右->下->左
            int curR = tR;
            int curC = tC;
            while(curC != dC) {
                res.add(matrix[curR][curC++]);
            }
            while(curR != dR) {
                res.add(matrix[curR++][curC]);
            }
            while(curC != tC) {
                res.add(matrix[curR][curC--]);
            }
            while(curR != tR) {
                res.add(matrix[curR--][curC]);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42054926/article/details/106137054