Skip to content

Commit 7b00a27

Browse files
Create 54. 螺旋矩阵.md
1 parent b41ad5d commit 7b00a27

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

Simulation/54. 螺旋矩阵.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#### 54. 螺旋矩阵
2+
3+
难度:中等
4+
5+
---
6+
7+
给你一个 `m``n` 列的矩阵 `matrix` ,请按照 **顺时针螺旋顺序** ,返回矩阵中的所有元素。
8+
9+
**示例 1:**
10+
11+
![](https://assets.leetcode.com/uploads/2020/11/13/spiral1.jpg)
12+
```
13+
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
14+
输出:[1,2,3,6,9,8,7,4,5]
15+
```
16+
17+
**示例 2:**
18+
19+
![](https://assets.leetcode.com/uploads/2020/11/13/spiral.jpg)
20+
```
21+
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
22+
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
23+
```
24+
25+
**提示:**
26+
27+
* `m == matrix.length`
28+
* `n == matrix[i].length`
29+
* `1 <= m, n <= 10`
30+
* `-100 <= matrix[i][j] <= 100`
31+
32+
---
33+
34+
模拟:
35+
36+
用若干个变量分别表示下一步走的方向,上下左右四个方向的边界以及当前点的坐标。再分别考虑当前点到达角落时后续的移动情况。
37+
38+
```Go
39+
func spiralOrder(matrix [][]int) []int {
40+
left, right, up, down := 0, len(matrix[0]) - 1, 0, len(matrix) - 1
41+
first, second := 0, 0
42+
flag, sum := 1, (right + 1) * (down + 1)
43+
res := make([]int, sum)
44+
for cnt := 0; cnt < sum; cnt++ {
45+
res[cnt] = matrix[first][second]
46+
if flag == 1 {
47+
if second == right{
48+
flag = 2
49+
up++
50+
first++
51+
}else {
52+
second++
53+
}
54+
} else if flag == 2 {
55+
if first == down {
56+
flag = 3
57+
right--
58+
second--
59+
} else {
60+
first++
61+
}
62+
} else if flag == 3 {
63+
if second == left {
64+
flag = 4
65+
down--
66+
first--
67+
} else {
68+
second--
69+
}
70+
} else if flag == 4 {
71+
if first == up {
72+
flag = 1
73+
left++
74+
second++
75+
} else {
76+
first--
77+
}
78+
}
79+
}
80+
return res
81+
}
82+
```

0 commit comments

Comments
 (0)