【剑指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.

 

思路:

关键注意①每一圈中四条边的边界,要每一次都打印到这一条边的末尾。右边的策略是错的,因为在只有一行一列时每一条边都判定该元素是下一条边的,导致错误。

                     

②下面的边和左边的边还需要判断跟上面的边或右边的边是否重复。防止只有一行或者只有一列时出现重复。

vector<int> printMatrix(vector<vector<int> > matrix) {
    vector<int> ans;
    if(matrix.empty()) return ans;
    int m = matrix.size();
    int n = matrix[0].size();
    int r, c;
    for(int k = 0; k <= (min(m, n) - 1) / 2; k++) //打印的圈数 最外圈为第0圈
    {
        //从左到右 最上面的那条边
        r = k;
        for(c = k; c <= n - 1 - k; c++)
            ans.push_back(matrix[r][c]);
        //从上到下 最右边的那条边
        c = n - 1 - k;
        for(r = k + 1; r <= m - 1 - k; r++)
            ans.push_back(matrix[r][c]);
        //从右到左 最下面的那条边
        r = m - 1 - k;
        for(c = n - 2 - k; c >= k && r > k; c--) //需要判断与上面的边不重合
            ans.push_back(matrix[r][c]);
        //从下到上 最左边的那条边
        c = k;
        for(r = m - 2 - k; r >= k + 1 && c < n - 1 - k; r--) //需要判断与右边的边不重合
ans.push_back(matrix[r][c]); } return ans;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值