顺时针打印矩阵

本文介绍了一种按顺时针方向从外向里打印矩阵的方法。通过将矩阵视为多个圈层,利用循环逐步打印每个圈层的元素。具体实现了四个步骤:从左到右、从上到下、从右到左、从下到上的打印过程,并考虑了边界条件。

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

剑指offer面试题20

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

打印一圈的功能实现:
1. 从左到右打印一行
2. 从上到下打印一行
3. 从右到左打印一行
4. 从下到上打印一行
每一步根据起始坐标和终点坐标用一个循环就能打印出一行或者一列
第一步是必须的。
若只有一行,就不需要第二步。也就是说第二步的前提条件是终止行号大于起始行号;
第三步的前提条件是圈内至少有两行两列;(也就是终止行号大于起始行号,终止列号大于起始列号)。
第四步的前提条件是圈内至少有三行两列;(也就是终止行号比起始行号至少大2,终止列号大于起始列号)。

循环结束条件判断:
1. 打印第一圈的左上角的坐标是(0,0),第二圈的左上角的坐标是(1,1),依次类推。可发现左上角的坐标的行标和列标是一样的。可以设为(start,start)
2. 对于5*5的矩阵,最后一圈只有一个数字,对应坐标为(2,2),我们发现5 > 2*2
对于6*6的矩阵,最后一圈只有4个数字,其左上角坐标仍为(2,2),我们发现6 > 2*2 于是得出让循环继续的条件是 Col > startX * 2并且Row > startY * 2

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> ans;    //用来存放打印的数据

        int row = matrix.size();      //行
        int col = matrix[0].size();   //列

        //只有一行,直接返回数组
        if(row == 0)    
            return ans;

        //起点坐标(start,start)
        int start = 0;

        //循环条件的判断
        while(col > start*2 && row > start*2)
        {
            //终点坐标
            int endX = row - start -1;
            int endY = col - start -1;

            int i;

            //从左到右打印
            for(i = start; i <= endY; i++)
            {
                ans.push_back(matrix[start][i]);    
            }

            //从上到下打印
            if(start < endX)
            {
                for(i = start + 1; i <= endX; i++)
                {
                    ans.push_back(matrix[i][endY]);    
                }
            }

            //从右到左打印
            if(start < endX && start < endY)
            {
                for(i = endY - 1; i >= start; i--)
                {
                    ans.push_back(matrix[endX][i]);    
                }
            }

            //从下到上打印
            if(start < endY && start < endX - 1)
            {
                for(i = endX - 1; i >= start + 1; i--)
                {
                    ans.push_back(matrix[i][start]);    
                }
            }  
            start++;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值