关注公众号:【THU小鱼干杂货铺】
不间断分享LeetCode优质解题思路、大厂算法题解、学习资料等
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
笔记:
1. 默认值初始化,list中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此list被初始化为包含7个0。
当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。
vector<int> list(7);
2.指定值初始化,ilist5被初始化为包含7个值为3的int数组;
vector<int> ilist5(7,3);
3.二维数组初始化visited[rows][columns]的实例:
vector<vector<bool>> visited(rows, vector<bool>(columns));
思路:
进行dfs深搜
dfs()参数讲解:
1.dir表示当前的方向;
2.step是终止条件,从0开始,当走到m*n长度结束,即一共有返回的数组ans已经装满了m*n个元素(matrix矩阵有m行n列);
3.i,j是矩阵元素坐标;
4.m,n是矩阵的行列
5.matrix,题目要求的矩阵
6.visited,标记是否已经访问过的数组
7.ans,结果数组
然后进行右——下——左——上搜索的思路,
比如刚开始先向右进行搜索装载ans,当下标越界或者下一步向右的坐标已经访问过,那么更换方向向下搜索
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if(matrix.empty()||matrix[0].empty()) return ans;
int m = matrix.size();
int n = matrix[0].size();
//二维数组初始化m*n,另一种方式
vector<vector<bool>> visited(m, vector<bool>());//初始层数,赋值
for (int i = 0; i < m; i++) {
visited[i].resize(n);
}
dfs("right",0,0,0,m,n,matrix,visited,ans);
return ans;
}
void dfs(string dir,int step,int i,int j,int m,int n,vector<vector<int>>& matrix,vector<vector<bool>>& visited,vector<int>& ans){
if(step==m*n) return;
if(i>=0&&j>=0&&i<m&&j<n&&!visited[i][j]){
visited[i][j] = true;
ans.push_back(matrix[i][j]);
if(dir=="right"){
if(j+1<n&&!visited[i][j+1]) dfs("right",step+1,i,j+1,m,n,matrix,visited,ans);
else dfs("down",step+1,i+1,j,m,n,matrix,visited,ans);
}
else if(dir=="down"){
if(i+1<m&&!visited[i+1][j]) dfs("down",step+1,i+1,j,m,n,matrix,visited,ans);
else dfs("left",step+1,i,j-1,m,n,matrix,visited,ans);
}
else if(dir=="left"){
if(j>0&&!visited[i][j-1]) dfs("left",step+1,i,j-1,m,n,matrix,visited,ans);
else dfs("up",step+1,i-1,j,m,n,matrix,visited,ans);
}
else if(dir=="up"){
if(i>0&&!visited[i-1][j]) dfs("up",step+1,i-1,j,m,n,matrix,visited,ans);
else dfs("right",step+1,i,j+1,m,n,matrix,visited,ans);
}
// visited[i][j] = false;
}
}
};