您的位置:首页 > 其它

Leetcode 59. Spiral Matrix II

2016-12-10 00:00 330 查看

题目描述

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

1. 一般求解:

class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ret;
if(n == 0) return ret;

ret = vector<vector<int> > (n, vector<int>(n, 0));
int count = 0;
int size = n * n;
int rmin, rmax, cmin, cmax;
rmin = cmin = 0;
rmax = cmax = n - 1;
while(1)
{
for(int c = cmin; c <= cmax; c++)
{
ret[rmin][c] = ++count;
if(count >= size)
return ret;
}
for(int r = rmin + 1; r <= rmax; r++)
{
ret[r][cmax] = ++count;
if(count >= size)
return ret;
}
for(int c = cmax - 1; c >= cmin; c--)
{
ret[rmax][c] = ++count;
if(count >= size)
return ret;
}
for(int r = rmax - 1; r > rmin; r--)
{
ret[r][cmin] = ++count;
if(count >= size)
return ret;
}
cmin++, rmin++, cmax--, rmax--;
}
}
};

2. 状态机求解:

class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ret;
if(n == 0) return ret;

ret = vector<vector<int> >(n, vector<int>(n, 0));
int size = n * n;
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int count = 0;
int r = 0, c = 0, direction = 0;
while(count < size)
{
switch(direction)
{
//topLeft->topRight
case 0:
ret[r][c++] = ++count;
//beyond the bounder, turn direction, turn to next position
if(c > right)
{
c--, r++;
direction = 1;
top++;
}
break;

//rightTop -> rightBottom
case 1:
ret[r++][c] = ++count;
if(r > bottom)
{
r--, c--;
right--;
direction = 2;
}
break;

//BottomRight -> bottomLeft
case 2:
ret[r][c--] = ++count;
if(c < left)
{
c++, r--;
bottom--;
direction = 3;
}
break;

//leftBottom -> leftTop
case 3:
ret[r--][c] = ++count;
if(r < top)
{
r++, c++;
left++;
direction = 0;
}
}
}
return ret;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: