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 };

 

posted @ 2020-03-19 18:04  Jinxiaobo0509  阅读(105)  评论(0)    收藏  举报