题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:
通过分析其实不难发现, 在矩阵当中只有四条路可走:
- 从左往右
- 从上往下
- 从右往左
- 从下往上
确定了这四条路径, 我们用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;
}
};