题目

英文

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

Example 1:

Input:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:

Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

中文

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

思路

  • 所有走过的节点标记为null
  • 用turn标记当前走向,如果下一个节点为null或notSet,则调转到下一个方向。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class Solution {
function spiralOrder($matrix) {
$row = count($matrix);
if($row == 0)
{
return [];
}
$columu = count($matrix[1]);
$currentpoint = $matrix[0][0];
$turn = 0;
$i = 0;
$j = 0;
while(isset($currentpoint) && !is_null($currentpoint))
{
//向右
$ret[] = $currentpoint;
$matrix[$i][$j] = null;
if($turn == 0)
{
if(isset($matrix[$i][$j+1])&&!is_null($matrix[$i][$j+1]))
{
$currentpoint = $matrix[$i][$j+1];
$j++;
} elseif(isset($matrix[$i+1][$j])&&!is_null($matrix[$i+1][$j])) {
$currentpoint = $matrix[$i+1][$j];
$i++;
$turn = 1;
continue;
} else {
$currentpoint = null;
}
}
//向下
if($turn == 1)
{
if(isset($matrix[$i+1][$j])&&!is_null($matrix[$i+1][$j]))
{
$currentpoint = $matrix[$i+1][$j];
$i++;
} elseif(isset($matrix[$i][$j-1])&&!is_null($matrix[$i][$j-1])) {
$currentpoint = $matrix[$i][$j-1];
$j--;
$turn = 2;
continue;
} else {
$currentpoint = null;
}
}
//向左
if($turn == 2)
{
if(isset($matrix[$i][$j-1])&&!is_null($matrix[$i][$j-1]))
{
$currentpoint = $matrix[$i][$j-1];
$j--;
} elseif(isset($matrix[$i-1][$j])&&!is_null($matrix[$i-1][$j])) {;
$currentpoint = $matrix[$i-1][$j];
$i--;
$turn = 3;
continue;
} else {
$currentpoint = null;
}
}
if($turn == 3)
{
if(isset($matrix[$i-1][$j])&&!is_null($matrix[$i-1][$j]))
{
$currentpoint = $matrix[$i-1][$j];
$i--;
} elseif(isset($matrix[$i][$j+1])&&!is_null($matrix[$i][$j+1])) {
$currentpoint = $matrix[$i][$j+1];
$j++;
$turn = 0;
continue;
} else {
$currentpoint = null;
}
}
}
return $ret;
}
}