54. Spiral Matrix

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.
posted @ 2021-04-21 10:12  Makerr  阅读(37)  评论(0编辑  收藏  举报