题目:
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]
.
思路:
设置四个形成闭环的前进方向:right -> down -> left -> up -> right,一旦发现已到达访问边界,则修改方向接着前进,直到访问完所有元素。我原来写的代码很笨拙,用了O(n^2)的空间复杂度来标记被访问过的位置。后来参考小榕流光的实现,发现只需要用四个变量就可以标记访问边界,这样空间复杂度可以降低到O(1)。
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
if(matrix.size() == 0) return result;
int rows = matrix.size(), cols = matrix[0].size();
int left = 0, right = cols - 1, top = 0, bottom = rows - 1; // initialize the boundary
int x = 0, y = 0, dx = 1, dy = 0; // initialize direction as right
for(int i = 0; i < rows * cols; i++)
{
result.push_back(matrix[y][x]);
x += dx, y += dy;
if(dx == 1 && x > right) // turn down
top++, x--, y++, dx = 0, dy = 1;
else if(dx ==-1 && x<left) // turn up
bottom--, x++, y--, dx = 0, dy = -1;
else if(dy == 1 && y>bottom) // turn left
right--, x--, y--, dx=-1, dy=0;
else if(dy == -1 && y <top) // turn right
left++, x++, y++, dx = 1, dy = 0;
}
return result;
}
};