classSolution { public: vector<int> spiralOrder(vector<vector<int>>& matrix){ int m = matrix.size(); int n = matrix[0].size(); int x = min(m / 2, n / 2);//循环圈数 int offset = 1;//控制每条边所要处理的个数 int startx = 0, starty = 0, i = 0, j = 0;//每一圈的起始位置和转圈时的下标 vector<int> res; while(x--) { i=startx; j=starty; for (; j < n - offset; j++)//往右 res.push_back(matrix[i][j]); for (; i < m - offset; i++)//往下 res.push_back(matrix[i][j]); for (; j > startx; j--)//往左 res.push_back(matrix[i][j]); for (; i > starty; i--)//往上 res.push_back(matrix[i][j]); startx++; starty++; offset++; } if (res.size() < n * m && n > m)//对多出来的行的处理 { for (int i = starty; i < n - offset+1; i++) res.push_back(matrix[startx][i]); } elseif (res.size() < n * m && n < m)//对多出来的列的处理 { for (int i = startx; i < m - offset + 1; i++)//注意是m-offset+1而不是n-offset+1,不要想当然 res.push_back(matrix[i][starty]); } elseif(n==m&&n%2!=0)//和上一题一样处理n为奇数的情况,就是补全中心少的那个数 res.push_back(matrix[n/2][n/2]); return res; } };
classSolution { public: vector<int> spiralArray(vector<vector<int>>& array){ vector<int> res; if(array.size()==0) return res; int m = array.size(); int n = array[0].size(); int x = min(m / 2, n / 2);//循环圈数 int offset = 1;//控制每条边所要处理的个数 int startx = 0, starty = 0, i = 0, j = 0;//每一圈的起始位置和转圈时的下标 while(x--) { i=startx; j=starty; for (; j < n - offset; j++)//往右 res.push_back(array[i][j]); for (; i < m - offset; i++)//往下 res.push_back(array[i][j]); for (; j > startx; j--)//往左 res.push_back(array[i][j]); for (; i > starty; i--)//往上 res.push_back(array[i][j]); startx++; starty++; offset++; } if (res.size() < n * m && n > m)//对多出来的行的处理 { for (int i = starty; i < n - offset+1; i++) res.push_back(array[startx][i]); } elseif (res.size() < n * m && n < m)//对多出来的列的处理 { for (int i = startx; i < m - offset + 1; i++)//注意是m-offset+1而不是n-offset+1,不要想当然 res.push_back(array[i][starty]); } elseif(n==m&&n%2!=0)//和上一题一样处理n为奇数的情况,就是补全中心少的那个数 res.push_back(array[n/2][n/2]); return res; } };