算法之路-数组篇(01)顺时针打印矩阵

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

输入输出示例

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
输入: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]

解题思路

思路就是从最外层先从左上角到右上角,再从右上角到右下角,再次右下角到左下角,再次左下角到左上角一个一个加入自己创建的答案vector
然后进行下次循环,直到最终的循环处理的数据剩一行或者一列或者一个的时候,输出,跳出循环
用四个数字top,left,right,bottom存四个方向的极限
在这里插入图片描述

代码实现

class Solution {
    
    
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
    
    
         if(matrix.size()==0||matrix[0].size()==0)
         {
    
    
             return {
    
    };
         }
        int Top=0,Bottom=matrix.size()-1,Left=0,Right=matrix[0].size()-1;
        vector<int> Answers;
        while(Top<=Bottom&&Left<=Right)
        {
    
    
            for(int k=Left;k<=Right;k++)
            {
    
    
             Answers.push_back(matrix[Top][k]);
            }
            for(int k=Top+1;k<=Bottom;k++)
            {
    
    
                Answers.push_back(matrix[k][Right]);
            }
            if(Left<Right&&Top<Bottom)//这里为什么要有判断,是为了判断是不是只剩一行,或者一列,或者一个,因为如果是这样,上面两次循环已经处理了数据,就不需要在输出后面两次步骤了。
            {
    
    
              for(int k=Right-1;k>=Left;k--)
            {
    
    
             Answers.push_back(matrix[Bottom][k]);
            }
            for(int k=Bottom-1;k>=Top+1;k--)
            {
    
    
                Answers.push_back(matrix[k][Left]);
            }
            }
            Top++;
            Left++;
            Right--;
            Bottom--;

        }
       return Answers;
    }
};

复杂度分析

输入m行,n列的时候,因为输入的每一行每一列刚好执行每个数据一次,所以时间复杂度为O(mn);
空间复杂度:O(n)。因为要有vexctor存放结果。
Over!
注:本人正在努力建设自己的公众号,大家可以关注公众号,此文章也上线我的公众号,公众号将免费提供大量教学Unity相关内容,除了从Unity入门到数据结构设计模式外,我还会免费分享我再游戏开发中使用的素材,书籍,插件,希望大家可以关注我,提前谢谢啦!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44739495/article/details/110227090