题目链接:Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
这道题的要求是给定m*n的矩阵,按螺旋顺序返回所有元素(顺时针)。
简单的数组操作问题,只需要按右、下、左、上的顺序逐行或列遍历数组。不过需要注意边界问题,假设当前在[x, y]位置:
- 向右遍历时,由于x不变,y每次加1,因此要求y要小于n-x即可;
- 向下遍历时,由于y不变,x每次加1,因此要求x要小于m-(n-y-1)即可;
- 向左遍历时,由于x不变,y每次减1,因此要求y要不小于m-x-1即可;
- 向上遍历时,由于y不变,x每次减1,因此要求x要不小于y+1即可。
时间复杂度:O(mn)
空间复杂度:O(mn)
1 class Solution
2 {
3 public:
4 vector<int> spiralOrder(vector<vector<int> > &matrix)
5 {
6 vector<int> vi;
7
8 if(matrix.size() == 0)
9 return vi;
10
11 int m = matrix.size(), n = matrix[0].size();
12 int x = 0, y = 0, mn = m * n - 1;
13 vi.push_back(matrix[x][y]);
14
15 while(mn > 0)
16 {
17 while(y + 1 < n - x && mn -- > 0)
18 vi.push_back(matrix[x][++ y]);
19
20 while(x + 1 < m - (n - y - 1) && mn -- > 0)
21 vi.push_back(matrix[++ x][y]);
22
23 while(y - 1 >= m - x - 1 && mn -- > 0)
24 vi.push_back(matrix[x][-- y]);
25
26 while(x - 1 >= y + 1 && mn -- > 0)
27 vi.push_back(matrix[-- x][y]);
28 }
29
30 return vi;
31 }
32 };