顺时针打印矩阵

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

思路:
通过分析其实不难发现, 在矩阵当中只有四条路可走:

  1. 从左往右
  2. 从上往下
  3. 从右往左
  4. 从下往上

确定了这四条路径, 我们用up, down, left, right分别表示矩阵的上, 下, 左, 右边界
按照题目要求
从左往右走, 走完之后改变上边界条件, 即up++(因为最上面一条路径上的数字已经放入数组当中)
同理, 从上往下, right–
从右往左 down–;
从下往上 left++;

这其中需要注意的一点是, 每改变一次边界条件, 最好都做一个越界判断, 否则可能会出现同一条路径走两次的情况.
举个例子来说:
输入:
[1]
[2]
[3]
[4]
[5]
输出:
1 2 3 4 5

如果不进行边界条件判断,
给定边界条件
up = 0, left = 0, right = 0. down = 4;
首先 从左往右走, 1放入数组, up++, up = 1;
接下来从上往下走, 2, 3, 4, 5放入数组, right–, 此时right = -1;
注意此时数组中已经为应该输出的结果
left > right, 假如我们没有做这个判断, 终止循环, 再往下走
从右往左走, right已经变为-1, 说明从右往左走不通, down–, down = 3;
此时会利用下边界接着从下往上走(up-down), 将4, 3, 2放入数组, 此时结果出错! 因为循环早在left > right的时候就应该结束了.

下面的代码在每次修改边界条件的时候, 都会进行条件判断.

代码示例:

class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int> ret;
        int left = 0;
        int right = matrix[0].size() - 1;
        int up = 0;
        int down = matrix.size() - 1;
        int i = 0;
        while (1)
        {
            //从左往右走
            for (int i = left; i <= right; ++i)
            {
                ret.push_back(matrix[up][i]);
            }
            ++up;//上边界减1
            if (up > down)
                break;//判断是否越界, 防止同样的路走第二遍
            //从上往下走
            for (int i = up; i <= down; ++i)
            {
                ret.push_back(matrix[i][right]);
            }
            --right;//右边界减一
            if (left > right)
                break;
            //从右往左走
            for (int i = right; i >= left; --i)
            {
                ret.push_back(matrix[down][i]);
            }
            --down;//下边界减1
            if (up > down)
                break;
            //从下往上走
            for (int i = down; i >= up; --i)
            {
                ret.push_back(matrix[i][left]);
            }
            ++left;//左边界减1
            if (left > right)
                break;
        }
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值