题目:螺旋矩阵

对res数组赋值的具体流程我放在注释里了

其实思路倒还是不难想到,就是代码实现可能需要动下脑子

这里是定义了原矩阵的上、下、左、右边界,而螺旋移动的情况有四种:

1.从左向右(在顶部):相当于消去了一行,因此上边界需要收缩一行

2.从上到下(在右端):相当于消去了一列,因此右边界收缩一列

3.从右到左(在底部):同理,下边界向上收缩一行

4.从下到上(在左端):同理,左边界向右收缩一列

具体的方向的控制是通过direction对4求模实现的,数字0、1、2、3对应的方向我也写在注释里了

  1
  2vector<int> spiralOrder(vector<vector<int>>& matrix)
  3
  4{
  5
  6    //  设一个 n * m 的矩阵
  7
  8    // (第 0 行 -> 第 m - 1 列 -> 第 n - 1 行 -> 第 0 列) ->
  9
 10    // (第 1 行 -> 第 m - 2 列 -> 第 n - 2 行 -> 第 1 列) ->
 11
 12    // (第 2 行 -> 第 m - 3 列 -> 第 n - 3 行 -> 第 2 列) -> .....
 13
 14
 15
 16    int rows = matrix.size();       // n
 17
 18    int cols = matrix[0].size();    // m
 19
 20    std::vector<int> res;
 21
 22    res.reserve(rows * cols);
 23
 24
 25
 26    int top = 0;
 27
 28    int left = 0;
 29
 30    int bottom = rows - 1;
 31
 32    int right = cols - 1;
 33
 34
 35
 36    int direction = 0;  // 0:右, 1:下, 2:左, 3:上
 37
 38
 39
 40    // 只要围墙没有互相穿透,就继续走
 41
 42    while(top <= bottom && left <= right)
 43
 44    {
 45
 46        switch(direction % 4)
 47
 48        {
 49
 50            case 0:
 51
 52                for(int i = left; i <= right; i++)
 53
 54                    res.push_back(matrix[top][i]);
 55
 56                top++;
 57
 58                break;
 59
 60
 61
 62            case 1:
 63
 64                for(int i = top; i <= bottom; i++)
 65
 66                    res.push_back(matrix[i][right]);
 67
 68                right--;
 69
 70                break;
 71
 72
 73
 74            case 2:
 75
 76                for(int i = right; left <= i; i--)
 77
 78                    res.push_back(matrix[bottom][i]);
 79
 80                bottom--;
 81
 82                break;
 83
 84
 85
 86            case 3:
 87
 88                for(int i = bottom; top <= i; i--)
 89
 90                    res.push_back(matrix[i][left]);
 91
 92                left++;
 93
 94                break;
 95
 96        }
 97
 98        direction++;
 99
100    }
101
102    return res;
103
104}