您的位置:首页 > 其它

Spiral Matrix && Spiral MatrixII

2014-11-07 22:00 281 查看
Spiral Matrix

我的思路:

1、这题是去螺旋遍历一个二维vector,将结果存入一维vector中。

2、建立一个死循环,在循环里面放置4个循环,表示螺旋遍历的四个方向,然后在每个方向的遍历之前放置判断条件,如果满足条件就返回。

3、程序中要维护四个变量,也就是小循环的判断条件,当前行列的起始和结束值。

代码如下:

vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> ans;
int m = matrix.size();
if (m == 0)
return ans;
int n = matrix[0].size();
int nbegin = 0, nend = n, mbegin = 0, mend = m;
while (1) {
if (nbegin == nend)
return ans;
for (int i = nbegin; i < nend; i++)
ans.push_back(matrix[mbegin][i]);
mbegin++;
if (mbegin == mend)
return ans;
for (int i = mbegin; i < mend; i++)
ans.push_back(matrix[i][nend - 1]);
nend--;
if (nbegin == nend)
return ans;
for (int i = nend - 1; i >= nbegin; i--)
ans.push_back(matrix[mend - 1][i]);
mend--;
if (mbegin == mend)
return ans;
for (int i = mend - 1; i >= mbegin; i--)
ans.push_back(matrix[i][nbegin]);
nbegin++;
}
return ans;
}


别人思路1:

1、DFS(深度优先搜索),建立一个4,2的二维数组。然后定义每个方向要改变的量。再定义一个二维数组来描述是否已经走过这个点。利用这个二维数组来退出递归。

2、基本的控制还是基于四个方向每次遍历的坐标改变。

别人思路2:

1、递归思想:写一个函数用来递归,这个函数中用if和else来区分上半部分,下半部分的遍历使用本身函数的递归。

2、缺点:代码太长,而且冗余,还不如直接用循环控制来得好。

我的心得:不管什么方法,关键还是在于理清楚每次每个方向上起始和结束改变的值。不管是循环还是递归。

Spiral MatrixII

我的思路:

1、题目要求:给一个数,给出这个数字大小的螺旋数组。

2、我的思路一塌糊涂,第一眼,返回值是vector,好麻烦啊, 每次push都要按照顺序来,怎么控制这个顺序?(stupid)直接将数存在数组中,然后再把数赋值到vector中。

3、赋值控制,要常规化,形成规律,一开始第一个循环是赋值n个,第二个循环n-1,第三个循环n-1,第四个n-2,这样控制起来就很麻烦。直接将每个循环赋值个数改为n-1。

4、n是奇偶数的差别,如果是奇数最后的一个数单独赋值。

代码如下:一团糟,变量命名也是醉了
vector<vector<int> > generateMatrix(int n) {
vector<vector<int>> ans;
if (n <= 0)
return ans;
int matrix

;
int	row = 0, column = 0, current = 1;
int len = n, start = 0;
int	tmp = n & 1 ? n / 2 : n / 2 + 1;

while (tmp--) {
while (column < len - 1)	matrix[row][column++] = current++;
while (row < len - 1)		matrix[row++][column] = current++;
while (column > start)		matrix[row][column--] = current++;
while (row > start)		matrix[row--][column] = current++;

len--;	start++;	column++;	row++;
}
if (n & 1)
matrix[n/2][n/2] = n * n;
for (int i = 0; i < n; i++) {
vector<int> a(matrix[i], matrix[i] + n);
ans.push_back(a);
}

return ans;
}


别人思路:

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