刷题 | 螺旋矩阵
螺旋矩阵
方法一:找出螺旋规律,确定边界条件,循环塞入新数组中。
class Solution { public: vector<int> spiralOrder(vector<vector<int> > &matrix) { int top = 0; int left = 0; int bottom = matrix.size()-1; int right = matrix[0].size()-1; vector<int> spma; while(top < (matrix.size()+1)/2 && left < (matrix.size()+1)/2) { //上面 从左到右 for(int i = left; i<=right; i++) spma.push_back(matrix[top][i]); //右边 从上到下 for(int i = top + 1; i <= bottom; i++) spma.push_back(matrix[i][right]); //下面 从右到左 for(int i = right - 1; top != bottom && i >= left; i--) spma.push_back(matrix[bottom][i]); //左面 从下到上 for(int i = bottom - 1;left != right && i >= top + 1;i--) spma.push_back(matrix[i][left]); ++top; --bottom; ++left; --right; } return spma; } };
以上,测试案例通过,但提交时发生段溢出。
方法二:找出螺旋规律,一圈圈递归。
class Solution { public: void SpiralOrder(vector<vector<int> > &matrix, int top, int bottom, int left, int right, vector<int> &ivec) { if(top > bottom || left > right) return; if(top == bottom)//只剩一行 { for(int i = left; i <= right; i++) ivec.push_back(matrix[top][i]); return; } if(left == right) { for(int i = top; i <= bottom; i++) ivec.push_back(matrix[i][left]); return; } //上 从左到右 for(int i = left; i < right; i++) ivec.push_back(matrix[top][i]); //右 从上到下 for(int i = top; i < bottom; i++) ivec.push_back(matrix[i][right]); //下 从右到左 if(top < bottom) { for(int i = right; i > left; i--) ivec.push_back(matrix[bottom][i]); } //左 从下到上 if(left < right) { for(int i = bottom; i > top; i--) ivec.push_back(matrix[i][left]); } SpiralOrder(matrix,++top,--bottom,++left,--right,ivec);//递归 } vector<int> spiralOrder(vector<vector<int> > &matrix) { if(matrix.empty()) return vector<int>(); vector<int> ivec; SpiralOrder(matrix,0,matrix.size()-1,0,matrix[0].size()-1,ivec); return ivec; } };
以上,通过啦,但性能一般。