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

# 理解

因为是按顺时针的顺序打印矩阵中的数字,所以是 先打印出数组的第一行数据(row = 0, col = 0~3), 之后便是打印最后一列的数据(row = 1~3, col = 3), 接着打印最后一行(row = 3, col = 2~0), 打印第一列上(row = 2~1, col = 0)。

# 代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> res = new ArrayList<>();
        int r1 = 0, r2 = matrix.length - 1;
        int c1 = 0, c2 = matrix[0].length - 1;
        while(r1 <= r2 && c1 <= c2) {
            for(int i = c1; i <= c2; i++)
                res.add(matrix[r1][i]);
            for(int i = r1 + 1; i <= r2; i++)
                res.add(matrix[i][c2]);
            if(r1 != r2)
                for(int i = c2 - 1; i >= c1; i--)
                    res.add(matrix[r2][i]);
            if(c1 != c2)
                for(int i = r2 - 1; i > r1; i--)
                    res.add(matrix[i][c1]);
            r1++; r2--; c1++; c2--;
        }
        return res;
    }
}