题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 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]
思路
分别使用up、down、left、right来表示矩阵的边界
遍历的顺序
1.左到右 matrix[up][left]....matrix[up][right]
2.上到下 matrix[up+1][right]....matrix[down][right] //注意up+1是为了边界的缩进
3.右到左 matrix[down][right-1]....matrix[down][left] //注意right-1是为了边界的缩进
4.下到上 matrix[down+1][left]....matrix[up][left] //down-1同上
这道题主要的难点是如何去确定四条边界,初始化的时候,up就是0,down是x_len-1,left是0,right是y_len-1。按照上述遍历顺序进入while循环,每一次遍历后需要进行边界缩进和边界判断,若left>right或者up>down时,说明遍历结束,直接break结束。下文代码的核心在于每一次操作完一边(左到右、上到下、右到左和下到上)后,都会对边界进行缩进和判断。
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
int x_len=matrix.size();//行数
int y_len=matrix[0].size();//列数
//将四个点的界限都标记出来
int left=0,right=y_len-1,up=0,down=x_len-1;
while(true){
//从左到右 赋值
for(int i=left;i<=right;i++)
ans.push_back(matrix[up][i]);
if(++up > down)//进行边界缩进 up=up+1操作 注意此处的++up 在up==down 之前都是进行up=up+1的更替
break;
//从上到下 此时的up的值相比较上一个for中的up已经加了1
for(int i=up;i<=down;i++)
ans.push_back(matrix[i][right]);
if(--right < left)//进行边界缩进 right=right-1操作
break;
//从右到左 注意right的值变化
for(int i=right;i>=left;i--)
ans.push_back(matrix[down][i]);
if(--down < up)//进行边界缩进 down=down-1操作
break;
//从下到上 注意down的值变化
for(int i=down;i>=up;i--)
ans.push_back(matrix[i][left]);
if(++left > right)//进行边界缩进 left=left+1操作
break;
}
return ans;
}