顺时针打印矩阵

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

/*
*思路:矩阵从外向里顺时针打印,可以分解成从(0,0)开始顺时针遍历最外层,然后从(1,1)开始顺时针遍历第二层,依次向里
*在遍历某一层的时候需要知道这几个信息:遍历起点,该层的行数和列数(行数列数用来确定执行for循环遍历时的条件)
*遍历的时候需要注意当最内层是只有一行或者一列的情况
*  原矩阵       第一层        第二层
* 1 2 3 4     1 2 3 4    
* 2 3 4 5     2     5        3 4
* 1 6 5 6     1     6        6 5
* 0 9 8 7     0 9 8 7
*
*/

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        printMatrixHelper(matrix, 0, 0, matrix.length, matrix[0].length, arrayList);
        return arrayList;
    }
    //遍历函数,matrix为原矩阵,(m,n)是遍历起点,rows,cols分别为该层行数和列数,arrayList存储遍历结果
    private void printMatrixHelper(int[][] matrix, int m, int n, int rows, int cols, ArrayList<Integer> arrayList){
        if(rows <= 0 || cols <= 0)   //递归出口,当rows或cols小于等于0时遍历结束
            return;
        int i = 0, j = 1;            //i,j分别用来控制水平方向上和竖直方向上的for循环条件()
        //首先从起点开始向右遍历直到该行遍历结束,如下
        // 1 2 3 4         1 2 3 4
        // 2     5  ---》
        // 1     6
        // 0 9 8 7
        for(; i < cols; i++)
            arrayList.add(matrix[m][n+i]);
        i--;      //这里注意for循环执行完毕之后i多加了一次,即for循环完毕后i==cols,需要将i--
        //接着从(m, n + cols - 1)这个点开始向下遍历(也就是例子里值为4这个点)遍历结束后如下
        // 1 2 3 4
        //       5
        //       6
        //       7
        //这里注意(m,n + cols - 1)这个点(例子里的4这个点)不要重复遍历了,所以j从1开始
        for(; j < rows; j++)
            arrayList.add(matrix[m+j][n+cols-1]);
        j--;        //同i
        //当该层不是一行或者一列的时候,需要遍历该层下方和左方
        if(cols > 1 && rows > 1){
            //该层下方从点(m + rows - 1,n + i)开始向左遍历(例子里7这个点)
            // 1 2 3 4
            //       5
            //       6
            // 0 9 8 7
            //同样注意不要重复遍历
            for(; i > 0; i--)
                arrayList.add(matrix[m+rows-1][n+i-1]);
            //从点(m + j, n)向上遍历(例子里的0)
            // 1 2 3 4
            // 2     5
            // 1     6
            // 0 9 8 7
            //同样注意不要重复遍历,这里多注意一点,起点(m,n)一开始已经遍历过所以j>1
            for(; j > 1; j--)
                arrayList.add(matrix[m+j-1][n]);
        }
        printMatrixHelper(matrix, m + 1, n + 1, rows - 2, cols - 2, arrayList);   //递归遍历向里的一层
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值