题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
输入输出示例
输入: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入门到数据结构设计模式外,我还会免费分享我再游戏开发中使用的素材,书籍,插件,希望大家可以关注我,提前谢谢啦!