输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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]
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { //特殊情况,注意为空返回1 if(matrix.empty()) return {}; vector<int>res; int m = matrix.size();//代表横着有m个容器 int n = matrix[0].size();//竖着方向有n个值 vector<vector<bool>> st(m,vector<bool>(n,false));//注意写法! //(0,1)(1,0)(0,-1)(-1,0) //这四组值就是为了向上,向左,向下,向右移动用的 //注意这种是顺时针转,题目要求的 int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int d=0;//就是上面两个的序号移动值 int x=0,y=0;//(0,0)作为起始位置 int a=0,b=0;//作为临时值 for(int i=0; i<m*n; i++) { //第一个起始值插入并变为true res.push_back(matrix[x][y]); st[x][y]=true; //准备转移到下一个值 int a=x+dx[d]; int b=y+dy[d]; //先判断是否是边界 //大佬有一点想不通,为什么a>= m,b >= n 要让a,也就是x坐标和m(也就是有多少行比较)? //不应该是和有多少列的n进行比较么? //原因看下图 if(a<0 || a>m ||a==m || b<0 || b>n ||b==n || st[a][b]) { d=(d+1)%4;//注意防止d出边界4 a=x+dx[d]; b=y+dy[d]; } //下面这两个千万不要在else里面 //因为下面这两个每一轮都是必须执行的 x=a; y=b; } return res; } };注意:题目要求顺时针打印,所以一定要注意!