【leetcode】Spiral Matrix

Spiral Matrix

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[

 [ 1, 2, 3 ],

 [ 4, 5, 6 ],

 [ 7, 8, 9 ]

]

You should return [1,2,3,6,9,8,7,4,5].

 
 
如果下一步会遇到访问过的节点或者越界的节点,那么就转向。
转向按照右,下,左,上
 
 1 class Solution {

 2 public:

 3     vector<int> spiralOrder(vector<vector<int> > &matrix) {

 4         int m=matrix.size();

 5         if(m==0) return vector<int>();

 6        

 7         int n=matrix[0].size();

 8        

 9         vector<int> result(m*n);

10        

11         vector<vector<bool> > visited(m,vector<bool>(n,false));

12        

13         vector<pair<int,int>> dir(4);

14         dir[0]=pair<int,int>(0,1);

15         dir[1]=pair<int,int>(1,0);

16         dir[2]=pair<int,int>(0,-1);

17         dir[3]=pair<int,int>(-1,0);

18        

19         int i,j,k,count;

20         i=j=k=count=0;

21  

22         while(1)

23         {              

24             if(count==m*n) break;

25  

26             result[count]=matrix[i][j];

27             visited[i][j]=true;

28  

29             if(i+dir[k].first>m-1||j+dir[k].second>n-1||i+dir[k].first<0||j+dir[k].second<0||visited[i+dir[k].first][j+dir[k].second])

30             {

31                 k=(++k)%4;

32             }

33  

34             i+=dir[k].first;

35             j+=dir[k].second;

36            

37             count++;

38         }

39        

40         return result;

41     }

42 };

 

 
 
另外一种方法:
 
 1 class Solution {

 2 public:

 3     vector<int> spiralOrder(vector<vector<int> > &matrix) {

 4         int m=matrix.size();

 5         if(m==0) return vector<int>();

 6        

 7         int n=matrix[0].size();

 8        

 9         vector<int> result;

10        

11        

12         int x1=0;

13         int y1=0;

14         int x2=m-1;

15         int y2=n-1;

16        

17        

18         while(1)

19         {

20            

21             for(int j=y1;j<=y2;j++) result.push_back(matrix[x1][j]);

22             x1++;

23            

24            

25             for(int i=x1;i<=x2;i++) result.push_back(matrix[i][y2]);

26             y2--;

27            

28            

29             if(x2+1!=x1)

30                 for(int j=y2;j>=y1;j--) result.push_back(matrix[x2][j]);

31             x2--;

32            

33             if(y1!=y2+1)

34                 for(int i=x2;i>=x1;i--) result.push_back(matrix[i][y1]);

35  

36             y1++;

37            

38             if(result.size()==m*n) break;

39         }

40        

41         return result;

42     }

43  

44 };

 

你可能感兴趣的:(LeetCode)