题目:螺旋矩阵
对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}