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

思路:
 1.确认是否为只有一行或一列的特殊情况
 2.顺时针将圈一个个剥离,一个圈即一个矩形,如下图,橙色为第一圈,蓝色为第二圈
在这里插入图片描述
 3.由图可知,第一圈的范围(蓝色),由[ startRow ][ startCol ] (即[0][0])到[ endRow ][ endCol ]确定
先向右走,从startcol ~ endCol,即第一行
再向下走,因为第一个元素4已记录过,所以从startRow+1开始走, 到 endRow结束,即最后一列
再向左走,因为第一个元素2已记录过,所以从endCol-1开始走,到startCol结束,即最后一行
再向上走,因为第一个元素5已记录过,最后一个元素1也已记录过,所以从endRow-1到startRow+1
至此一圈结束

 4.由图可以看出下一圈的范围由[ startRow+1 ][ startCol+1 ] (即[1][1])到[ endRow-1 ][ endCol-1 ]确定,重复上述过程直到startRow > endRow 或 startCol > endCol

实现:
*通过简单循坏即可完成,注意去掉重复元素就行

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int row = matrix.length;
        if(row==0)
            return null;
        int col = matrix[0].length;
        if(col==0)
            return null;
        ArrayList<Integer> list = new ArrayList<Integer>();      //新建动态数组存储结果
      
        int startRow = 0;
        int endRow = row-1;
        int startCol = 0;
        int endCol = col-1;
        while(startRow<=endRow&&startCol<=endCol){
            if(startRow==endRow){                         //只有一行
                for(int i=startCol;i<=endCol;i++)
                    list.add(matrix[startRow][i]);
                return list;
            }
            if(startCol==endCol){                             //只有一列
                for(int i=startRow;i<=endRow;i++)
                    list.add(matrix[i][startCol]);
                return list;
            }
            for(int i=startCol;i<=endCol;i++)             //向右
                list.add(matrix[startRow][i]);
            for(int i=startRow+1;i<=endRow;i++)         //向下,注意去掉第一个元素
                list.add(matrix[i][endCol]);
            for(int i=endCol-1;i>=startCol;i--)           //向左,注意去掉第一个元素
                list.add(matrix[endRow][i]);
            for(int i=endRow-1;i>=startRow+1;i--)     //向下,注意去掉第一个和最后一个元素
                list.add(matrix[i][startCol]);
             
            startRow = startRow + 1;         //确定下一圈的范围
            startCol = startCol + 1;                
            endRow = endRow - 1;
            endCol = endCol - 1;
        }
        return list;
    }
}