image.png

思路:递归模拟

  • 可以将大问题拆解成小问题,可以将整个顺时针的过程,看成是不断重复“从左上角打印到右下角”这个过程
  • 上、右、下、左分别是四个过程,逐个打印即可
  • 不断递归,即可得到整个序列
  • 注意细节的处理(如何解决重复的问题)

    代码:

  1. class Solution {
  2. public:
  3. vector<int> cricle(vector<vector<int>>& matrix, int row_begin, int col_begin, int row_end, int col_end) {
  4. if (row_end < row_begin || col_end < col_begin) {
  5. return {};
  6. }
  7. vector<int> cur_matrix;
  8. // 上边缘从左到右打印
  9. for (int i = col_begin; i <= col_end; ++i) {
  10. cur_matrix.push_back(matrix[row_begin][i]);
  11. }
  12. // 右边缘从上到下打印, 注意右边缘不包含起始位置 和 末尾位置
  13. for (int i = row_begin + 1; i < row_end; ++i) {
  14. cur_matrix.push_back(matrix[i][col_end]);
  15. }
  16. // 下边缘从右到左打印
  17. // 防止重复
  18. if (row_begin != row_end) {
  19. for (int i = col_end; i >= col_begin; --i) {
  20. cur_matrix.push_back(matrix[row_end][i]);
  21. }
  22. }
  23. // 左边缘从下到上打印, 注意左边缘不包含起始位置 和 末尾位置
  24. // 防止重复
  25. if (col_begin != col_end) {
  26. for (int i = row_end - 1; i > row_begin; --i) {
  27. cur_matrix.push_back(matrix[i][col_begin]);
  28. }
  29. }
  30. vector<int> all_matirx = cricle(matrix, row_begin + 1, col_begin + 1, row_end - 1, col_end - 1);
  31. cur_matrix.insert(cur_matrix.end(), all_matirx.begin(), all_matirx.end());
  32. return cur_matrix;
  33. }
  34. vector<int> spiralOrder(vector<vector<int>>& matrix) {
  35. int row = matrix.size();
  36. vector<int> one_dimen;
  37. if (row == 0) {
  38. return one_dimen;
  39. }
  40. int col = matrix[0].size();
  41. one_dimen = cricle(matrix, 0, 0, row - 1, col - 1);
  42. return one_dimen;
  43. }
  44. };