刚开始的时候低估了这个题目,只把3X3的情况做出来了(错误代码放在文末)
思路:由于不需要存储访问过的路径,因此可以考虑通过更新边界的方式控制访问路径。
首先访问上边界所在的行,上边界访问结束之后,更新上边界
随后访问由边界所在的列,右边界访问结束之后,更新右边
其他边界同理,在更新边界的过程中一旦出现上下边界相交,或者左右边界相交的情况,则跳出循环
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
int m = matrix.size();
int n = matrix[0].size();
vector<int> res;
if (m == 0 || n == 0) return res;
vector<vector<int>> flag(m, vector<int>(n, 0));
int s = 0, z = 0, x = m - 1, y = n - 1;//分别为上左下右边界
while (true) {
for (int i = z; i <= y; i++)res.push_back(matrix[s][i]);//从左到右
if (++s > x) break;//更新上边界,上边界与下边界重合时,跳出循环
for (int i = s; i <= x; i++)res.push_back(matrix[i][y]);//从上到下
if (--y < z) break;//更新右边界
for (int i = y; i >= z; i--)res.push_back(matrix[x][i]);//从右到左
if (--x < s) break;//更新下边界
for (int i = x; i >= s; i--)res.push_back(matrix[i][z]);//从右到左
if (++z > y) break;//更新左边界
}
return res;
}
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
//开始时优先向右走,直到右侧无路可走
//然后优先向下,直到下册无路可走
//左,上同理
//建立二维数组标记是否访问过
vector<int> res;
int m = matrix.size();
int n = matrix[0].size();
if (m == 0 || n == 0) return res;
vector<vector<int>> flag(m, vector<int>(n, 0));
if (n == 1) {
for (int k = 0; k < m; k++)
res.push_back(matrix[k][0]);
return res;
}
if (m == 1) {
for (int k = 0; k < n; k++)
res.push_back(matrix[0][k]);
return res;
}
int i = 0, j = 0;
while (flag[i][j] == 0)
{
while (flag[i][j] == 0 && j < n - 1) {
res.push_back(matrix[i][j]);
flag[i][j] = 1;//标记为访问过
j++;
}
if (flag[i][j] == 1) break;
while (flag[i][j] == 0 && i < m - 1) {
res.push_back(matrix[i][j]);
flag[i][j] =1;//标记为访问
i++;
}
if (flag[i][j] == 1) break;
while (flag[i][j] == 0 && j > 0) {
res.push_back(matrix[i][j]);
flag[i][j] =1;//标记为访问过
j--;
}
if (flag[i][j] == 1) break;
while (flag[i][j] ==0 && i > 1) {
res.push_back(matrix[i][j]);
flag[i][j] =1;//标记为访问过
i--;
}
if (flag[i][j] == 1) break;
res.push_back(matrix[i][j]);
j++;
}
return res;
}