码迷,mamicode.com
首页 > 其他好文 > 详细

54. Spiral Matrix

时间:2021-04-22 15:34:12      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:代码   nts   tor   rgba   ++   end   tps   inf   jpg   

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.

54. Spiral Matrix

标签:代码   nts   tor   rgba   ++   end   tps   inf   jpg   

原文地址:https://www.cnblogs.com/Makerr/p/14684094.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!