牛客网 顺时针打印矩阵

该博客介绍了如何实现顺时针打印矩阵的算法。首先判断矩阵是否为空,然后从左上角开始按顺时针方向逐层遍历。文章详细分析了遍历过程中的四种情况:从左到右、从上到下、从右到左、从下到上,并给出了具体的判断条件和代码实现。
摘要由CSDN通过智能技术生成

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: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、从左上角开始,按照由外向里顺时针画圈的方式遍历矩阵,从下图可以看出每个圈的起始位置的坐标都是(0,0)、(1,1)。。。首先根据下图判断循环的终止条件:


3、每次计算完一个圈之后,start++,来计算下一个圈。

4、对于打印有四种情况:从左到右,从上到下,从右到左,从下到上,下面分别来分析每一种情况:

    从左到右:从每个圈的左上角的位置为起始位置,到本行结束endY;

    从上到下:首先要保证至少有两行数据,也就是start<endX,然后从start+1行开始到最后一行;

    从右到左:要保证至少有两行两列,然后从endY-1开始到start;

    从下到上:至少要是三行两列,从endX-1开始到start-1;

5、使用list的addAll()函数,将PrintMaxtrixCircle中的list值赋值给printMatrix中的list。

代码如下:

import java.util.ArrayList;

public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       if(matrix==null){//矩阵为空
           return null;
       }
        int row=matrix.length;//获得矩阵的行数
        int col=matrix[0].length;//获得矩阵的列数
        int start=0;//每一圈起始的位置
        ArrayList<Integer> list=new ArrayList<Integer>();
        while(row>2*start&&col>2*start){//循环终止的条件
            list.addAll(PrintMaxtrixCircle(matrix,col,row,start));//如果满足条件,就打印
            start++;//开始循环下一个圈
        }
        return list;
    }
    public ArrayList<Integer> PrintMaxtrixCircle(int[][] matrix,int col,int row,int start){
        int endX=row-1-start;//行数的结束位置
        int endY=col-1-start;//列数的结束位置
        ArrayList<Integer> list=new ArrayList<Integer>();
        //从左到右打印1行
        int number;
        for(int i=start;i<=endY;i++){
            number=matrix[start][i];
            list.add(number);
        }
        //从上到下打印列,至少要有两列
        if(endX>start){
            for(int i=start+1;i<=endX;i++){
                number=matrix[i][endY];
                list.add(number);
            }
        }
        //从右到左打印,至少要有两行两列
        if(start<endX&&start<endY){
            for(int i=endY-1;i>=start;i--){
                number=matrix[endX][i];
                list.add(number);
            }
        }
        //从下到上打印,至少要是三行两列
        if(start<endX-1&&start<endY){
            for(int i=endX-1;i>start;i--){
                number=matrix[i][start];
                list.add(number);
            }
        }
        return list;
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值