给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。
样例
给定如下矩阵:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
应返回 [1,2,3,6,9,8,7,4,5]
。
下面的矩阵处理方式,不仅可用于这道题,还适合很多其他的面试题就是矩阵分圈处理。printEdge方法是转圈打印一个子矩阵的外层。
class Solution {
public:
/*
* @param matrix: a matrix of m x n elements
* @return: an integer list
*/
vector<int> Order;
vector<int> spiralOrder(vector<vector<int>> matrix) {
if(matrix.size() == 0)
return Order;
//l1是左上角行,l2是左上角列,r1是右下角行,r2是右下角列
int startrow=0;
int startcol=0;
int endrow=matrix.size()-1;
int endcol=matrix[0].size()-1;
//这里写if就错,须写while
while(startrow<=endrow&&startcol<=endcol){
printEdge(matrix,startrow++,startcol++,endrow--,endcol--);
}
return Order;
}
void printEdge(vector<vector<int>>& matrix,int l1,int l2,int r1,int r2){
if(l1==r1){ //只有一行
for(int i=l2;i<=r2;i++){
Order.push_back(matrix[l1][i]);
}
}else if(l2==r2){ //只有一列
for(int i=l1;i<=r1;i++){
Order.push_back(matrix[i][l2]);
}
}else{ //一般情况
int curl1=l1;
int curl2=l2;
while(curl2!=r2){
Order.push_back(matrix[l1][curl2]);
curl2++;
}
while(curl1!=r1){
Order.push_back(matrix[curl1][r2]);
curl1++;
}
while(curl2!=l2){
Order.push_back(matrix[r1][curl2]);
curl2--;
}
while(curl1!=l1){
Order.push_back(matrix[curl1][l2]);
curl1--;
}
}
}
};
看到其他人的代码更简洁:
vector<int> spiralOrder(vector<vector<int>> matrix) {
vector<int> Order;
if(matrix.size() == 0)
return Order;
//l1是左上角行,l2是左上角列,r1是右下角行,r2是右下角列
int startrow=0;
int startcol=0;
int endrow=matrix.size()-1;
int endcol=matrix[0].size()-1;
//这里写if就错,须写while
while(startrow<=endrow&&startcol<=endcol){
// left to right
for(int i=startcol;i<=endcol;++i)
Order.push_back(matrix[startrow][i]);
// top to bottom
for(int j=startrow+1;j<=endrow;++j)
Order.push_back(matrix[j][endcol]);
// right to left
if(endrow != startrow)
for(int i=endcol-1;i>=startcol;--i)
Order.push_back(matrix[endrow][i]);
// bottom to top
if(endcol != startcol)
for(int j=endrow-1;j>startrow;--j)
Order.push_back(matrix[j][startcol]);
startrow++;
startcol++;
endrow--;
endcol--;
}
return Order;
}