您的位置:首页 > 其它

59.Spiral Matrix II

2015-06-25 14:59 295 查看
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++;
}
}

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: