给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
思路:
千万不要被示例所迷惑!!!矩阵里是任意的数,没有任何规律可言!
回到本题,大体思路可以继续按照螺旋矩阵II的步骤进行。59.螺旋矩阵II(中等)-优快云博客
然而有一些需要区别的注意点:
- 由于矩阵里的数是随机的,就不要用count累计了
- 循环的圈数为行和列较小的数
- 要创建一个一维数组,大小为m*n(行*列),并初始化定义一个索引号,在4个for循环遍历每条边时进行更新。
- 索引号index更新++时,一定要在结果数组赋完值之后再更新,结果数组就用for循环里面的ij索引号索引的二维数组进行赋值。
- 最关键的一点,在绕圈遍历完后,可能会存在没有遍历的一行或者一列数据,例如示例2,一圈遍历的数为1 2 3 4 8 12 11 10 9 5,但遍历完这些后,按照原来的思路,6和7就没有遍历了。然而有的矩阵只需要绕圈遍历即可,不用在单独遍历一行或一列,因此需要进行判断。我发现,绕完圈后,只会剩余1行x列或者x行1列,因此可以来计算,将矩阵原始的行数和列数分别减去圈数的2倍,就会得到剩余未遍历的行数和列数。
- 如果剩余的行数和列数中存在0,那么代表画完圈就遍历完了,直接返回结果。
- 如果都不为0,那么一定存在行或者列数为1的情况,代表矩阵还没遍历完,这时注意因为在之前循环遍历时,画圈起始的行和列索引是在4个for循环后面更新的,还有结果数组的索引index也是在每次赋完值更新。因此结束画圈后,所有的索引现在都指向新的位置。
- 因为剩余的是1行或者1列,只写一层for循环就足够,索引号依旧是结果数组的index,结束条件就是index<size,然后进行赋值操作,res[index]=matrix[startx][starty],这个startx和starty就是之前循环结束的更新好的起始行列索引。如果剩余是1行,那么赋值完把starty++,如果剩余是1列,则让startx++,循环结束后,返回结果。
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int m=matrix.size();//矩阵行数 int n=matrix[matrix.size()-1].size();//矩阵列数 vector<int>res(m*n,0); int loop=min(m,n)/2; int i,j,startx=0,starty=0,index=0,offset=1; while(loop) { i=startx; j=starty; for(j=starty;j<n-offset;j++) { res[index]=matrix[i][j]; index++; } for(i=startx;i<m-offset;i++) { res[index]=matrix[i][j]; index++; } for(;j>starty;j--) { res[index]=matrix[i][j]; index++; } for(;i>startx;i--) { res[index]=matrix[i][j]; index++; } startx++; offset++; starty++; loop--; } int a=m-(min(m,n)/2)*2; int b=n-(min(m,n)/2)*2; if(a==0||b==0) { return res; } else { for(;index<m*n;index++) { if(a==1) { res[index]=matrix[startx][starty]; starty++; } else{ res[index]=matrix[startx][starty]; startx++; } } return res; } } };

926





