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].
这道题如果搞得像麻绳一样缠在一起就无法解开了。
如果一条一条分好了,就势如破竹,一下子解开了。
遇上这样的题还是先不要想优化的算法比较妥当,尤其是不要吝啬空间的使用,否则会乱成一堆,所以我这里用了四个下标,使得程序更加清晰点。
思路:
1 先剥开最外一层matrix,然后是下一层,一层一层搞定
注意:
1 直接使用多个下标,不要使用计算的方法,利用一个下标计算出其他三个下标,那样做很容易出错。
2 最后结束条件:剩下一行或者一列的时候,结束循环,额外写一点代码处理这最后一行或者一列。
class Solution {
public:
vector
spiralOrder(vector
> &matrix) { vector
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; } };