题目描述
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
示例
示例1
输入:
[[1,2,3],[4,5,6],[7,8,9]]
返回值:
[1,2,3,6,9,8,7,4,5]
示例2
输入:
[]
返回值:
[]
解题思路:
思路
center=min((m-1)/2,(n-1)/2)
由左上角元素a开始 每次遍历一圈
//!!!!!!!!!!
//当最内圈遍历的矩形为一行或者一列时,会漏掉matrix[a+r-1][a+c-1]
a从0至center
//左上到右上
for(int i=0;i<n-1;i++) matrix[a][a+i]
//右上到右下
for(int i=0;i<m-1;i++) matrix[a+i][a+n-1] //注意这里是a+n-1
//右下到左下
for(int i=n-1;i>0;i--) matrix[a+m-1][a+i] //注意这里是a+m-1
//左下到左上
for(int i=m-1;i>0;i--) matrix[a+i][a]
m=m-2;
n=n-2
注意点:
//当m-2,n-2后 所有矩阵的位置坐标都应基于a的基础上加
//当最内圈遍历的矩形为一行或者一列时,会漏掉matrix[a+r-1][a+c-1]
//特殊情况:当矩阵为空时,计算m=0后应立即返回空矩阵
vector<vector<int> > matrix;
matrix = {};
int m = matrix.size();
int n = matrix[0].size(); //!!!!!错误:矩阵matrix为空,不存在matrix[0]
cout << m << n <<endl;
代码:
vector<int> spiralOrder(vector<vector<int> > &matrix) {
vector<int> ans;
int m = matrix.size();
if(!m){
return ans;
}
int n = matrix[0].size();
int center = min((m - 1) / 2, (n - 1) / 2);
for (int a = 0; a <= center; a++) {
for (int i = 0; i < n - 1; i++)
ans.push_back(matrix[a][a + i]);
for (int i = 0; i < m - 1; i++)
ans.push_back(matrix[a + i][a + n - 1]);
if (m == 1 || n == 1) {
ans.push_back(matrix[a + m - 1][a + n - 1]);
}
else {
for (int i = n - 1; i > 0; i--)
ans.push_back(matrix[a + m - 1][a + i]);
for (int i = m - 1; i > 0; i--)
ans.push_back(matrix[a + i][a]);
}
m = m - 2;
n = n - 2;
}
return ans;
}