每天一道剑指offer-顺时针打印矩阵

本文介绍了一种算法,用于按顺时针方向从外到内打印矩阵中的每个数字。通过将矩阵视为由多个圆圈组成,使用循环来逐圈打印,确保了打印顺序的正确性。文章详细解析了循环条件及每圈四步打印的前提条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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),以此类推每次循环的行列起始坐标都是相同的(start,start)。因此可以分析出循环继续的条件是columns > start2并且rows > start2。有了循环继续的条件后,我们要分析每次循环那4步的前提条件。第一步肯定是必定会经过的,因为打印一圈至少有一步。第二步的前提是终止行号大于起始行号,第三步的前提是终止行号大于起始行号,终止列号大于起始列号,因为圈内至少有2行2列,第四步的前提条件是终止行号比起始行号至少大2,终止列号大于起始行号,即至少有3行2列。

代码

public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> res =new ArrayList<>();
        if(matrix ==null || matrix.length<=0){
            return null;
        }
        int start = 0;
        while(matrix.length > start*2 && matrix[0].length > start*2){
            circle(matrix,start,res);
            start++;
        }
        return res;
    }
    public void circle(int [][] matrix,int start,ArrayList<Integer> list){
        int row = matrix.length;
        int col = matrix[0].length;
        int endx = row - start;
        int endy = col - start;
        
        //第一步
        for(int i =start;i<endy;i++){
            list.add(matrix[start][i]);
        }
        //第二步
        for(int i =start+1;i<endx;i++){
            list.add(matrix[i][endy-1]);
        }
        //第三步
        if (start < endy-1 && start < endx-1) {
            for(int i =endy-1-1;i>=start;i--){
                list.add(matrix[endx-1][i]);
            }
        }
        //第四步
        if (start < endy-1 && start < endx - 2) {
            for(int i =endx-1-1;i>start;i--){
                list.add(matrix[i][start]);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值