题目描述
给定一个包含 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; } };
|