注意边界的处理。
代码:
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
if (matrix.empty() == true)
{
return vector<int>();
}
int x1 = 0, y1 = 0;
int x2 = matrix.size()-1, y2 = matrix[0].size()-1;
vector<int> ret;
for ( ; x1<=x2 && y1<=y2; ++x1, ++y1, --x2, --y2)
{
for (int j = y1; j <= y2; ret.push_back(matrix[x1][j++])) {}
for (int i = x1+1; i <= x2; ret.push_back(matrix[i++][y2])) {}
for (int j = y2-1; x1!=x2 && j>=y1; ret.push_back(matrix[x2][j--])) {} // x1!=x2
for (int i = x2-1; y1!=y2 && i>=x1+1; ret.push_back(matrix[i--][y1])) {} // y1!=y2
}
return ret;
}
};
之前的写法:
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
if (matrix.empty() == true)
{
return vector<int>();
}
int x1 = 0, y1 = 0;
int x2 = matrix.size()-1, y2 = matrix[0].size()-1;
vector<int> ret;
while (x1<=x2 && y1<=y2)
{
for (int j = y1; j <= y2; ++ j)
{
ret.push_back( matrix[x1][j] );
}
for (int i = x1+1; i <= x2; ++ i)
{
ret.push_back( matrix[i][y2] );
}
for (int j = y2-1; x1!=x2 && j>=y1; -- j) // 加上x1!=x2避免重复输出
{
ret.push_back( matrix[x2][j] );
}
for (int i = x2-1; y1!=y2 && i>x1; -- i) // 加上y1!=y2避免重复输出
{
ret.push_back( matrix[i][y1] );
}
++x1, ++y1, --x2, --y2;
}
return ret;
}
};