给定一个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注意点: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> matrix; matrix = {}; int m = matrix.size(); int n = matrix[0].size(); //!!!!!错误:矩阵matrix为空,不存在matrix[0] cout << m << n < 代码: vectorspiralOrder(vector > &matrix) { vector 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; }



