题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
数据范围
矩阵中元素数量 $[0,400]$。
样例
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
思路
从点$(0,0)$开始,按右下左上的顺序,尝试能否走到下一个点未被走过的位置,如果不行就直接换方向,直到把所有的位置都走过为止。
代码
class Solution {
public:
vector<int> printMatrix(vector<vector<int> > matrix) {
//如果是空的,就直接返回一个空的vector
if (matrix.size() == 0 || matrix[0].size() == 0)
return {};
//i,j表示当前走到的位置,num表示一共走过了多少位置,res存我们的答案
int i = 0, j = 0, n = matrix.size(), m = matrix[0].size();
int num = 1;
vector<int> res;
res.push_back(matrix[0][0]);
//-1表示当前位置已经走过
//因为matrix[0][0]已经存入答案中了,所以要赋值-1
matrix[0][0] = -1;
//这里一定要设为<,因为当边界取<是会在走完等于后再退出的,取<=会死循环
while (num < n * m)
{
//在走之前要先判断是否能走
//往右尝试
while (j + 1 < m && matrix[i][j + 1] != -1)
{
res.push_back(matrix[i][j + 1]);
matrix[i][++ j] = -1;//标记被走过了
num ++;//走过的数量+1
}
//往下尝试
while (i + 1 < n && matrix[i + 1][j] != -1)
{
res.push_back(matrix[i + 1][j]);
matrix[++ i][j] = -1;
num ++;
}
//往左尝试
while (j - 1 >= 0 && matrix[i][j - 1] != -1)
{
res.push_back(matrix[i][j - 1]);
matrix[i][-- j] = -1;
num ++;
}
//往上尝试
while (i - 1 >= 0 && matrix[i - 1][j] != -1)
{
res.push_back(matrix[i - 1][j]);
matrix[-- i][j] = -1;
num ++;
}
}
return res;
}
};
好了,这就是这篇题解的全部内容了。感谢观看!
ヾ(o′▽`o)ノ°° .°谢谢ー° .°
$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\quad$$\mathcal{writer\enspace by \enspace acwing}$ : $\mathfrak{天元之弈}$
666
点赞。