再来一次经济危机把# Stock
d*n
1 楼
这道题直接打印总是容易出错, 用状态机就简单多了。
class Solution {
public:
enum Direct{
Right,
Down,
Left,
Up
};
void print(const vector > &matrix, int top, int bottom, int
left, int right, Direct dir, vector & output){
if (top > bottom || left > right) return;
switch(dir) {
case Right:
for(int i = left; i <= right; i++)
output.push_back(matrix[top][i]);
print(matrix, top+1, bottom, left, right, Down, output);
break;
case Down:
for(int i = top; i <= bottom; i++)
output.push_back(matrix[i][right]);
print(matrix, top, bottom, left, right-1, Left, output);
break;
case Left:
for(int i = right; i >= left; i--)
output.push_back(matrix[bottom][i]);
print(matrix, top, bottom-1, left, right, Up, output);
break;
case Up:
for(int i = bottom; i >= top; i--)
output.push_back(matrix[i][left]);
print(matrix, top, bottom, left + 1, right, Right, output);
break;
}
}
vector spiralOrder(vector > &matrix) {
vector output;
int M = matrix.size();
if (M < 1) return output;
int N = matrix[0].size();
print(matrix, 0,M-1, 0, N-1, Right, output);
return output;
}
};
class Solution {
public:
enum Direct{
Right,
Down,
Left,
Up
};
void print(const vector
left, int right, Direct dir, vector
if (top > bottom || left > right) return;
switch(dir) {
case Right:
for(int i = left; i <= right; i++)
output.push_back(matrix[top][i]);
print(matrix, top+1, bottom, left, right, Down, output);
break;
case Down:
for(int i = top; i <= bottom; i++)
output.push_back(matrix[i][right]);
print(matrix, top, bottom, left, right-1, Left, output);
break;
case Left:
for(int i = right; i >= left; i--)
output.push_back(matrix[bottom][i]);
print(matrix, top, bottom-1, left, right, Up, output);
break;
case Up:
for(int i = bottom; i >= top; i--)
output.push_back(matrix[i][left]);
print(matrix, top, bottom, left + 1, right, Right, output);
break;
}
}
vector
vector
int M = matrix.size();
if (M < 1) return output;
int N = matrix[0].size();
print(matrix, 0,M-1, 0, N-1, Right, output);
return output;
}
};