原题链接: 剑指 Offer 29. 顺时针打印矩阵.
题目要求
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
题解
算法思想:
- 使用两个数组dx、dy标志数组遍历的方向,且对于遍历过的数字置为false
- 当遇到数组越界或遍历过的数字,就改变方向
- 一维动态数组ans保存最终值
处理特殊情况
当矩阵为空的时候,也即matrix.empty()==true
,返回空数组
得到二维动态数组的行和列:
int n = matrix.size(), m = matrix[0].size();
创建一个bool类型的二维动态数组st,并且将其初始化为全false
:
作用:标记数组中的值是否被遍历过
vector<vector<bool>> st(n, vector<bool>(m, false));//标记数组中的值是否被遍历过
控制遍历方向
dx[d]
表示横坐标的移动,dy[d]
表示纵坐标的移动
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int d=0;//控制方向
代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;//存储最终的答案
if (matrix.empty()) return ans;
int n = matrix.size(), m = matrix[0].size();
vector<vector<bool>> st(n, vector<bool>(m, false));//标记数组中的值是否被遍历过
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int d=0;//控制方向
int x=0,y=0;
for(int i=0;i<n*m;i++)
{
ans.push_back(matrix[x][y]);
st[x][y]=true;
int a=x+dx[d],b=y+dy[d];
if(a<0||a>=n||b<0||b>=m||st[a][b])
{
d=(d+1)%4;
a=x+dx[d],b=y+dy[d];
}
x=a,y=b;
}
return ans;
}
};