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].

解析:这道题没有什么太过复杂的数据结构的思想,就是顺时针打印矩阵。我们来分析循环结束条件。假设这个矩阵的的行数rows,列数是columns。打印第一圈的左上角的坐标(1,1),第二圈的左上角的坐标是(2,2),以此类推。我们注意到,左上角的坐标中行标和列标总是相同的,浴室可以在矩阵中选取左上角为(start,start)的一圈作为我们分析的目标。对于一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2。对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角坐标仍为(2*2).我们发现6>2*2依然成立。我们可以得出,让循环继续的条件是columns>startX*2并且rows>startY*2。不过注意几种特殊情况,最后一圈可能退化成只有一行、只有一列,甚至只有一个数字.

class Solution {
public:
    void printSpiralOrder(vector<vector<int> > &matrix,int start,int columns,int rows,vector<int> &result)
    {
        //int rows=matrix.size();
        //int columns=matrix[0].size();
        int endX=columns-1-start;//
        int endY=rows-1-start;////from left to rigth
        for(int i=start;i<=endX;++i)
        {
            result.push_back(matrix[start][i]);
        }
        //from top to bottom
        if(start<endY)
        {
            for(int i=start+1;i<=endY;++i)
            {
                result.push_back(matrix[i][endX]);
            }
        }
        //from right to left
        if(start<endX && start<endY)
        {
            for(int i=endX-1;i>=start;--i)
            {
                result.push_back(matrix[endY][i]);
            }
        }
        //from bottom to top
        if(start<endX && start<endY-1)
        {
            for(int i=endY-1;i>=start+1;--i)
            {
                result.push_back(matrix[i][start]);
            }
        }
    }
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        vector<int> result;
        result.clear();
        int rows=matrix.size();
        if(rows<1)
            return result;
        int columns=matrix[0].size();
        int start=0;
        while(columns>start*2 && rows>start*2)
        {
            printSpiralOrder(matrix,start,columns,rows,result);
            ++start;
        }
        return result;
    }
};
原文地址:https://www.cnblogs.com/awy-blog/p/3647614.html