题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
样例
Input: [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路
-
描述
按照要求指定顺序输出即可。但是这里有两个难点:
- 如何控制上下左右输出。——使用经典技巧,dx、dy数组存储上下左右方向。
- 如何判断是否应该调整输出方向。——使用visited数组,当遇到数组元素为true,表明应该调整方向。
-
实现代码:
vector<int> printMatrix(vector<vector<int> > matrix) { vector<int> res; int n = matrix.size(); if(!n) // 数组为空,直接返回 { return res; } int m = matrix[0].size(); vector<vector<bool> > visited(n,vector<bool>(m,false)); int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1}; // 方向数组 int x = 0,y = 0,direct = 1; int a ,b; for(int i = 0; i < n*m ; i++) { res.push_back(matrix[x][y]); visited[x][y] = true; a = x + dx[direct]; b = y + dy[direct]; // 数组越界或者该元素已访问,调整方向 if((a >= n) || (a < 0) || (b >= m) || (b < 0) || (visited[a][b])) { direct = (direct + 1) % 4; } x = x + dx[direct]; y = y + dy[direct]; } return res; }