59.Spiral Matrix II

来源:互联网 发布:维普数据库论文查询 编辑:程序博客网 时间:2024/04/19 02:19

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]]

solution1

class Solution {public:    vector<vector<int> > generateMatrix(int n) {        if(n == 0) return vector<vector<int>>();        vector<vector<int>> ret(n, vector<int>(n, 0));                 int rowBegin = 0;        int rowEnd = n - 1;        int colBegin = 0;        int colEnd = n - 1;        int num = 1;                 while (rowBegin <= rowEnd && colBegin <= colEnd)        {            if (num <= n^2)            {                //向右遍历添加                for (int j = colBegin; j <= colEnd; j++)                {                    ret[rowBegin][j] = num;                    num++;                }            }            rowBegin++;                         if (num <= n^2)            {                //向下遍历添加                for (int i = rowBegin; i <= rowEnd; i++)                {                    ret[i][colEnd] = num;                    num++;                }            }            colEnd--;                         if (num <= n^2)            {                //向左遍历添加                for (int j = colEnd; j >= colBegin; j--)                {                    ret[rowEnd][j] = num;                    num++;                }            }            rowEnd--;                         if (num <= n^2)            {                //向上遍历添加                for (int i = rowEnd; i >= rowBegin; i--)                {                    ret[i][colBegin] = num;                    num++;                }            }            colBegin++;        }                 return ret;    }};

solution2

与顺时针打印矩阵算是相反的问题

class Solution {public:    vector<vector<int>> generateMatrix(int n) {        vector<vector<int>> ret;ret.resize(n);for (int i = 0;i<ret.size();++i){ret[i].resize(n,0);}int start = 0;int num = 1;while (n>2*start){constructMatrixOnce(ret,n,start++,num);}return ret;            }        void constructMatrixOnce(vector<vector<int>> &ret ,int n,int start,int& num){int endX = n-start-1;int endY = n-start-1;for(int i = start;i<=endX;++i)  {  ret[start][i] = num++; }if(start<endY)  {  for(int i = start+1;i<=endY;++i)  {  ret[i][endX] = num++; }  }if(start<endY && start<endX)  {  for(int i = endX-1;i>=start;--i)  {  ret[endY][i] = num++;}   } if(start<endX && endY-start>1)  {  for(int i = endY-1;i>=start+1;--i)  {  ret[i][start] = num++;}  }}};


0 0