Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
Example 1:
Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] Output: [1,2,3,4,8,12,11,10,9,5,6,7]
方法1:方法就是记住左上角和右下角顶点的行和列。在写代码的时候要注意细节:r和c变化方式,要对最后一行或一列进行单独处理。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int n=matrix.size();
if(n==0) return res;
int m=matrix[0].size();
int leftTopR=0,leftTopC=0,rightBotR=n-1,rightBotC=m-1;
int r=0,c=0;
while(leftTopR<rightBotR&&leftTopC<rightBotC){
r=leftTopR;
c=leftTopC;
while(c<=rightBotC){
res.push_back(matrix[r][c]);
c++;
}
c--;
r++;
while(r<=rightBotR){
res.push_back(matrix[r][c]);
r++;
}
r--;
c--;
while(c>=leftTopC){
res.push_back(matrix[r][c]);
c--;
}
c++;
r--;
while(r>leftTopR){
res.push_back(matrix[r][c]);
r--;
}
leftTopR++;
leftTopC++;
rightBotR--;
rightBotC--;
}
if(leftTopR==rightBotR){
c=leftTopC;
while(c<=rightBotC){
res.push_back(matrix[leftTopR][c]);
c++;
}
}else{
if(leftTopC==rightBotC){
r=leftTopR;
while(r<=rightBotR){
res.push_back(matrix[r][rightBotC]);
r++;
}
}
}
return res;
}
};