题目简介:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
1 2
| 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
|
示例 2:
1 2
| 输入:matrix = [[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 <= matrix.length <= 100
0 <= matrix[i].length <= 100
思路:
这题和我大一时候在算法书上看到的蛇形填数十分相似…可以用相同的套路。
以右、下、左、上的顺序将矩阵的数依次压入结果数组,直至一个方向无法再访问时,再进行下一个方向。需要注意的是,要设置一个visited
数组来判断当前数之前是否已经被访问到过,若被访问过则跳过此数。
tips:
- 注意代码具体实现来应对边界值的问题
- 初始化时可以先压入第一个数
- 注意
Vector
二维数组的实现
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) {
int x = 0; int y = 0;
vector<int> res; if(matrix.size() == 0) return res;
vector<vector<int>> visited(matrix.size(), vector<int>(matrix[0].size(), 0));
res.push_back(matrix[0][0]); visited[0][0] = 1; while(res.size() < matrix.size() * matrix[0].size()){
while(y + 1 < matrix[0].size() && !visited[x][y + 1]){
res.push_back(matrix[x][++y]); visited[x][y] = 1; } while(x + 1 < matrix.size() && !visited[x + 1][y]){
res.push_back(matrix[++x][y]); visited[x][y] = 1; } while(y - 1 >= 0 && !visited[x][y - 1]){
res.push_back(matrix[x][--y]); visited[x][y] = 1; } while(x - 1 >= 0 && !visited[x - 1][y]){
res.push_back(matrix[--x][y]); visited[x][y] = 1; } }
return res;
} };
|