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]
.
解析:这道题没有什么太过复杂的数据结构的思想,就是顺时针打印矩阵。我们来分析循环结束条件。假设这个矩阵的的行数rows,列数是columns。打印第一圈的左上角的坐标(1,1),第二圈的左上角的坐标是(2,2),以此类推。我们注意到,左上角的坐标中行标和列标总是相同的,浴室可以在矩阵中选取左上角为(start,start)的一圈作为我们分析的目标。对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角坐标仍为(2*2).我们发现6>2*2依然成立。我们可以得出,让循环继续的条件是columns>startX*2并且rows>startY*2。不过注意几种特殊情况,最后一圈可能退化成只有一行、只有一列,甚至只有一个数字.
class Solution { public: void printSpiralOrder(vector<vector<int> > &matrix,int start,int columns,int rows,vector<int> &result) { //int rows=matrix.size(); //int columns=matrix[0].size(); int endX=columns-1-start;//列 int endY=rows-1-start;//行 //from left to rigth for(int i=start;i<=endX;++i) { result.push_back(matrix[start][i]); } //from top to bottom if(start<endY) { for(int i=start+1;i<=endY;++i) { result.push_back(matrix[i][endX]); } } //from right to left if(start<endX && start<endY) { for(int i=endX-1;i>=start;--i) { result.push_back(matrix[endY][i]); } } //from bottom to top if(start<endX && start<endY-1) { for(int i=endY-1;i>=start+1;--i) { result.push_back(matrix[i][start]); } } } vector<int> spiralOrder(vector<vector<int> > &matrix) { vector<int> result; result.clear(); int rows=matrix.size(); if(rows<1) return result; int columns=matrix[0].size(); int start=0; while(columns>start*2 && rows>start*2) { printSpiralOrder(matrix,start,columns,rows,result); ++start; } return result; } };