思路:递归模拟
- 可以将大问题拆解成小问题,可以将整个顺时针的过程,看成是不断重复“从左上角打印到右下角”这个过程
- 上、右、下、左分别是四个过程,逐个打印即可
- 不断递归,即可得到整个序列
- 注意细节的处理(如何解决重复的问题)
代码:
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; } };