Leetcode-54.螺旋矩阵

题目描述

给定一个包含 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:模拟

完全模拟螺旋矩阵,考虑各种情况,代码比较乱

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 {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n=matrix.size();
vector<int> res;
if(n==0)
return res;
if(n==1)
{
for(int i=0;i<matrix[0].size();i++)
res.push_back(matrix[0][i]);
return res;
}
int m=matrix[0].size();
vector<vector<bool>> used(n,vector<bool>(m,false));

int r=0,c=1,i=0,j=0,x=0;
int l=n*m;
while(x++<l)
{
res.push_back(matrix[i][j]);

used[i][j]=true;
if(j==m-1)
{
c=0;
r=1;
if(i==n-1)
{
r=0;
c=-1;
}
}
else if(i==n-1)
{
c=-1;
r=0;
if(j==0)
{
r=-1;c=0;
}
}
else if(j==0&&i!=0)
{
c=0;
r=-1;
if(i==1)
{
r=0;c=1;
}
}
else
{
int qm=0;
while(used[i+r][j+c]!=false)
{

if(r==0&&c==1)
{
r=1;c=0;
}
else if(r==1&&c==0)
{
r=0;c=-1;
}
else if(r==0&&c==-1)
{
r=-1;c=0;
}
else if(r==-1&&c==0)
{
r=0;c=1;
}
qm++;
if(qm==4)
break;
}
}
i+=r;
j+=c;
}

return res;
}
};

解法2:模拟

改变思想,

这次我们改变边界值,使得代码简洁了很多

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
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n=matrix.size();
vector<int> res;
if(n==0)
return res;
int l=0,r=matrix[0].size()-1,t=0,b=matrix.size()-1;
while(l<=r&&t<=b)
{
for(int i=l;i<=r;i++)
{
res.push_back(matrix[t][i]);
}
t++;
if(t>b) break;
for(int i=t;i<=b;i++)
{
res.push_back(matrix[i][r]);
}
r--;
if(l>r) break;
for(int i=r;i>=l;i--)
{
res.push_back(matrix[b][i]);
}
b--;
for(int i=b;i>=t;i--)
{
res.push_back(matrix[i][l]);
}
l++;
}
return res;
}
};