输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入: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]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:本题看了剑指offer
的书上的思路。首先我们可以发现遍历完一圈,那么矩阵的行和列都少了1
,依次类推可以发现,我们每次打印的起点可以认为是从(0,0), (1,1), (2,2), (3,3).....(start,start)
,再次观察我们可以发现 对于一个n×m
的矩阵来讲,只要n > start*2
并且m > start*2
(注意start
是从0
开始的),都可以进行下一圈的遍历。
除此之外,在打印末一行或者某一列时,首先想好是否确实需要打印,可以看代码注释的部分。
class Solution {
public:
vector<int> ans;
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size()==0)
return ans;
int rows = matrix.size();
int columns = matrix[0].size();
int start = 0;
while((rows > (start<<1))&&(columns>(start<<1)))
{
Print(matrix,rows,columns,start);
++start;
}
return ans;
}
void Print(vector<vector<int>>& matrix,int rows,int columns,int start)
{
int endX = columns - 1 - start; //遍历一圈会减少两列
int endY = rows - 1 - start; //遍历一圈会减少两行
//从左到右打印一行
for(int i = start;i<=endX;++i)
{
ans.push_back(matrix[start][i]);
}
//从上到下打印一列
if(start < endY)
{
for(int i = start + 1;i <= endY;++i)
{
ans.push_back(matrix[i][endX]);
}
}
//从右到左打印一行
if(start < endX&& start < endY)//有这一行 并且确实这一行大于两个元素
{
for(int i = endX - 1;i >= start; --i)
{
ans.push_back(matrix[endY][i]);
}
}
//从下到上打印一列
if(start < endY -1 &&start < endX)//有这一列 并且这一列的元素至少有三个
{
for(int i = endY - 1;i>start;--i)
{
ans.push_back(matrix[i][start]);
}
}
}
};