思路:递归模拟
- 可以将大问题拆解成小问题,可以将整个顺时针的过程,看成是不断重复“从左上角打印到右下角”这个过程
- 上、右、下、左分别是四个过程,逐个打印即可
- 不断递归,即可得到整个序列
- 注意细节的处理(如何解决重复的问题)
代码:
class Solution {
public:
vector<int> cricle(vector<vector<int>>& matrix, int row_begin, int col_begin, int row_end, int col_end) {
if (row_end < row_begin || col_end < col_begin) {
return {};
}
vector<int> cur_matrix;
// 上边缘从左到右打印
for (int i = col_begin; i <= col_end; ++i) {
cur_matrix.push_back(matrix[row_begin][i]);
}
// 右边缘从上到下打印, 注意右边缘不包含起始位置 和 末尾位置
for (int i = row_begin + 1; i < row_end; ++i) {
cur_matrix.push_back(matrix[i][col_end]);
}
// 下边缘从右到左打印
// 防止重复
if (row_begin != row_end) {
for (int i = col_end; i >= col_begin; --i) {
cur_matrix.push_back(matrix[row_end][i]);
}
}
// 左边缘从下到上打印, 注意左边缘不包含起始位置 和 末尾位置
// 防止重复
if (col_begin != col_end) {
for (int i = row_end - 1; i > row_begin; --i) {
cur_matrix.push_back(matrix[i][col_begin]);
}
}
vector<int> all_matirx = cricle(matrix, row_begin + 1, col_begin + 1, row_end - 1, col_end - 1);
cur_matrix.insert(cur_matrix.end(), all_matirx.begin(), all_matirx.end());
return cur_matrix;
}
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int row = matrix.size();
vector<int> one_dimen;
if (row == 0) {
return one_dimen;
}
int col = matrix[0].size();
one_dimen = cricle(matrix, 0, 0, row - 1, col - 1);
return one_dimen;
}
};