我的思路:
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、缺点:代码太长,而且冗余,还不如直接用循环控制来得好。
我的心得:不管什么方法,关键还是在于理清楚每次每个方向上起始和结束改变的值。不管是循环还是递归。
我的思路:
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[n][n];
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、暂时没有发现好的。