Spiral Matrix
Given a matrix ofmxnelements (mrows,ncolumns), 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]
.
这道题如果搞得像麻绳一样缠在一起就无法解开了。
如果一条一条分好了,就势如破竹,一下子解开了。
遇上这样的题还是先不要想优化的算法比较妥当,尤其是不要吝啬空间的使用,否则会乱成一堆,所以我这里用了四个下标,使得程序更加清晰点。
思路:
1 先剥开最外一层matrix,然后是下一层,一层一层搞定
注意:
1 直接使用多个下标,不要使用计算的方法,利用一个下标计算出其他三个下标,那样做很容易出错。
2 最后结束条件:剩下一行或者一列的时候,结束循环,额外写一点代码处理这最后一行或者一列。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
vector<int> res;
int row = matrix.size();
if (row < 1) return res;
int col = matrix[0].size();
int rowUpper = 0, rowLower = row - 1;
int colLeft = 0, colRight = col - 1;
while (rowUpper < rowLower && colLeft < colRight)
{
//插入最顶行
res.insert(res.end(), matrix[rowUpper].begin()+colLeft
, matrix[rowUpper].begin()+colRight+1);
rowUpper++;
//插入最右列
for (int i = rowUpper; i < rowLower; i++)
{
res.push_back(matrix[i][colRight]);
}
colRight--;
//插入最下面一行
res.insert(res.end(),matrix[rowLower].rbegin()+colLeft,
matrix[rowLower].rbegin()+colRight+2);
rowLower--;
//插入最左边一列
for (int i = rowLower; i >= rowUpper; i--)
{
res.push_back(matrix[i][colLeft]);
}
colLeft++;
}
if (rowUpper == rowLower)
{
//插入最后一行,注意下标和循环中的有点不一样
res.insert(res.end(), matrix[rowUpper].begin()+colLeft
, matrix[rowUpper].begin()+colRight+1);
}
else if (colLeft == colRight)
{
//插入最后一列,注意下标和循环中的有点不一样
for (int i = rowUpper; i <= rowLower; i++)
{
res.push_back(matrix[i][colRight]);
}
}
return res;
}
};
2014-1-29 更新
程序一样的思路,不过可以更加轻易的驾驭下标了
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> > &matrix)
{
vector<int> rs;
int row = matrix.size()-1;
if (row < 0) return rs;
int col = matrix[0].size()-1;
int i = 0;
for ( ; i < row && i < col; i++, row--, col--)
{
for (int j = i; j < col; j++)
{
rs.push_back(matrix[i][j]);
}
for (int j = i; j < row; j++)
{
rs.push_back(matrix[j][col]);
}
for (int j = col; j > i ; j--)
{
rs.push_back(matrix[row][j]);
}
for (int j = row; j > i ; j--)
{
rs.push_back(matrix[j][i]);
}
}
if (i == row) rs.insert(rs.end(),
matrix[row].begin()+i, matrix[row].begin()+col+1);
else if (i == col)
{
for ( ; i <= row; i++)
{
rs.push_back(matrix[i][col]);
}
}
return rs;
}
};