首页 > 代码库 > 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].

分析

举个例子自己从头到尾把数字列出来,很容易就找到规律了:
假设一维数组的坐标为x,取值范围是xMin~xMax;二维数组的坐标为y,取值范围是yMin~yMax。(也就是数组表示为int[y][x])
1. 从左到右,y=yMin,x: xMin->xMax,yMin++
2. 从上到下,x=xMax,y: yMin->yMax,xMax--
3. 从右到左,y=yMax,x: xMax->xMin,yMax--
4. 从下到上,x=xMin,y: yMax->uMin,xMin++
结束条件,xMin==xMax或者yMin==yMax
 
还要要注意的地方:空数组的情况要处理。
 
C++实现代码:
#include<iostream>#include<vector>using namespace std;class Solution{public:    vector<int> spiralOrder(vector<vector<int> > &matrix)    {        if(matrix.empty()||matrix[0].empty())            return vector<int>();        vector<int> ret;        int xmin=0;        int ymin=0;        int xmax=matrix[0].size()-1;        int ymax=matrix.size()-1;        ret.push_back(matrix[0][0]);        int i=0,j=0;        while(1)        {            while(i<xmax)                ret.push_back(matrix[j][++i]);            if(++ymin>ymax)                break;            while(j<ymax)                ret.push_back(matrix[++j][i]);            if(--xmax<xmin)                break;            while(i>xmin)                ret.push_back(matrix[j][--i]);            if(--ymax<ymin)                break;            while(j>ymin)                ret.push_back(matrix[--j][i]);            if(++xmin>xmax)                break;        }        return ret;    }};int main(){    Solution s;    vector<vector<int> > vec= {{1,2}};    vector<int> result=s.spiralOrder(vec);    for(auto a:result)        cout<<a<<" ";    cout<<endl;}

 

Spiral Matrix