Given an m x n
matrix
, return all elements of the matrix
in spiral order.
Example 1:
Input: matrix = [[1,2,3],[4,5,6],[7,8,9]] Output: [1,2,3,6,9,8,7,4,5]
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
思路:把矩阵看成若干个顺时针方向的圈组成。一圈一圈进行分析,找出每一圈打印结束的终止条件,再分析打印一圈的功能。
思路和代码来自《剑指Offer》一书
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> res; int rows=matrix.size(); int cols=matrix[0].size(); int start=0;//矩阵中选左上角(start,start)作为一圈分析的目标 while(cols>start*2&&rows>start*2){ int endX=cols-1-start;//终止列号 int endY=rows-1-start;//终止行号 //第一步,从左向右打印一行 for(int i=start;i<=endX;i++) res.push_back(matrix[start][i]); //第二步,从上到下打印一行,进行第二步打印条件是终止行号大于起始行号 if(start<endY){ for(int i=start+1;i<=endY;i++) res.push_back(matrix[i][endX]); } //第三步,从左向右打印,进行第三步的打印条件是圈内至少有两行两列,即终止行号大于起始行号且终止列号大于起始列号 if(start<endX&&start<endY){ for(int i=endX-1;i>=start;i--) res.push_back(matrix[endY][i]); } if(start<endX&&start<endY-1){ for(int i=endY-1;i>start;i--) res.push_back(matrix[i][start]); } start++;//一圈打印结束,往里面开始另一圈 } return res; } };
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Spiral Matrix.
Memory Usage: 6.7 MB, less than 98.93% of C++ online submissions for Spiral Matrix.