1 题目
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
2 尝试解
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
if(matrix.size() == 0) return result;
int m = matrix.size();
int n = matrix[0].size();
int direc = 1;
int up = 0;
int down = m - 1;
int left = 0;
int right = n - 1;
while(up <= down && left<=right){
if(direc%4 == 1){
for(int i = left; i <= right; i++){
result.push_back(matrix[up][i]);
}
up ++;
direc ++;
}
else if(direc%4 == 2){
for(int i = up; i <= down; i++){
result.push_back(matrix[i][right]);
}
right --;
direc ++;
}
else if(direc%4 == 3){
for(int i = right; i >= left; i--){
result.push_back(matrix[down][i]);
}
down --;
direc ++;
}
else{
for(int i = down; i >= up; i--){
result.push_back(matrix[i][left]);
}
left ++;
direc ++;
}
}
return result;
}
};
3 标准解
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<vector<int> > dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
vector<int> res;
int nr = matrix.size(); if (nr == 0) return res;
int nc = matrix[0].size(); if (nc == 0) return res;
vector<int> nSteps{nc, nr-1};
int iDir = 0; // index of direction.
int ir = 0, ic = -1; // initial position
while (nSteps[iDir%2]) {
for (int i = 0; i < nSteps[iDir%2]; ++i) {
ir += dirs[iDir][0]; ic += dirs[iDir][1];
res.push_back(matrix[ir][ic]);
}
nSteps[iDir%2]--;
iDir = (iDir + 1) % 4;
}
return res;
}