54. 螺旋矩阵
1 class Solution 2 { 3 vector<int> ans; 4 public: 5 vector<int> spiralOrder(vector<vector<int>>& matrix) 6 { 7 if(matrix.size() == 0) return {}; 8 int m = matrix.size(); 9 int n = matrix[0].size(); 10 int a1 = 0,b1 = 0; 11 int a2 = m - 1,b2 = n - 1; 12 13 while(a1 <= a2 && b1 <= b2) 14 { 15 spiral(matrix,a1,b1,a2,b2); 16 a1++,b1++,a2--,b2--; 17 } 18 return ans; 19 } 20 //x1、y1为起点横、纵坐标,x1、y1为终点横、纵坐标 21 void spiral(vector<vector<int>>& matrix,int x1,int y1,int x2,int y2) 22 { 23 if(x1 == x2 && y1 == y2) 24 { 25 ans.push_back(matrix[x1][y1]); 26 return; 27 } 28 else if(x1 == x2 && y1 != y2) 29 { 30 for(int j = y1;j <= y2;j ++) ans.push_back(matrix[x1][j]); 31 return; 32 } 33 else if(x1 != x2 && y1 == y2) 34 { 35 for(int i = x1;i <= x2;i ++) ans.push_back(matrix[i][y1]); 36 return; 37 } 38 else 39 { 40 for(int j = y1;j < y2;j ++)//第一行 41 { 42 ans.push_back(matrix[x1][j]); 43 } 44 for(int i = x1;i < x2;i ++)//最后一列 45 { 46 ans.push_back(matrix[i][y2]); 47 } 48 for(int j = y2;j > y1;j --)//最后一行 49 { 50 ans.push_back(matrix[x2][j]); 51 } 52 for(int i = x2;i > x1;i --)//第一列 53 { 54 ans.push_back(matrix[i][y1]); 55 } 56 } 57 } 58 };
1 class Solution 2 { 3 public: 4 vector<int> spiralOrder(vector<vector<int>>& matrix) 5 { 6 vector<int> res; 7 if(matrix.empty() || matrix[0].empty()) return res; 8 int m = matrix.size(),n = matrix[0].size(); 9 vector<vector<bool>> st(m,vector<bool>(n,false));// 记录该元素是否被打印 10 int dx[4] = {-1,0,1,0},dy[4] = {0,1,0,-1};// 上右下左 11 int x = 0,y = 0,d = 1;// d=1是因为最开始向右走 12 for(int i = 0;i < n * m;i ++) 13 { 14 res.push_back(matrix[x][y]); 15 st[x][y] = true; 16 17 int a = x + dx[d],b = y + dy[d]; 18 if(a < 0 || a >= m || b < 0 || b >= n || st[a][b]) 19 { 20 d = (d + 1) % 4; 21 a = x + dx[d],b = y + dy[d]; 22 } 23 x = a,y = b; 24 } 25 return res; 26 } 27 };
Mamba never out

浙公网安备 33010602011771号