题目描述
给定一个包含 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:模拟
完全模拟螺旋矩阵,考虑各种情况,代码比较乱
| 12
 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:模拟
改变思想,
这次我们改变边界值,使得代码简洁了很多
| 12
 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;
 }
 };
 
 |